gpt4 book ai didi

ruby-on-rails - 返回 false 则无法将项目添加到具有 :through 的 has_many

转载 作者:数据小太阳 更新时间:2023-10-29 08:39:13 25 4
gpt4 key购买 nike

我有这个模型关系

class User < ActiveRecord::Base
has_many :trip_memberships, dependent: :destroy
has_many :trips, through: :trip_memberships, uniq: true
end

class Trip < ActiveRecord::Base
has_many :trip_memberships, dependent: :destroy
has_many :members, through: :trip_memberships, source: :user, uniq: true
end

class TripMembership < ActiveRecord::Base
belongs_to :trip
belongs_to :user
end

当我将一些用户添加为旅行成员时,就像使用以下代码:

trip = Trip.last
john = User.last
trip.members # => [] Empty right now
trip.members << john
trip.members # => [john] Contains John
trip.members << john
trip.members # => [john] Contains only John, but...
TripMembership.all # => [TripMembership(trip, john), TripMembership(trip, john)]
# There is 2 memberships, even the accessor methods only show one
# member because of the :uniq option

我不想在 trip_memberships 中有重复项表,但我想遵循“告诉,不要问”的原则。我不想检查给定记录是否存在。

我将此验证添加到 TripMembership 模型

class TripMembership < ActiveRecord::Base
belongs_to :trip
belongs_to :user
validates_presence_of :trip_id, :user_id
validates_uniqueness_of :trip_id, scope: [:user_id]
validates_uniqueness_of :user_id, scope: [:trip_id]
end

我期待 <<concat当我尝试添加无法添加的记录时返回 false 的方法被救了,好像在里面有很多关系,不过好像跟through关系不是那样的。

trip.members << john # => ActiveRecord::RecordInvalid: Validation failed: Trip has already been taken, User has already been taken

有人知道一种优雅的方式来实现这个吗?我认为应该这样使用api。

if @trip.members << new_member
flash[:success] = "new member added"
else
flash[:error] = "can't add this member to trip"
end

最佳答案

你可以这样尝试:

 if @trip.members.include?(new_member)
flash[:error] = "Member already exists"
else
@trip.members << new_member
flash[:success] = "new member added"
end

编辑

has_many :members, through: :trip_memberships, source: :user do
def <<(member)
if self.include?(member)
false
else
super(Array(member)-self)
end
end
end

关于ruby-on-rails - 返回 false 则无法将项目添加到具有 :through 的 has_many,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/15091452/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com