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

标签 ruby-on-rails ruby activerecord database-relations

我有这个模型关系

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

当我添加一些用户作为旅行成员(member)时,如以下代码所示:

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/

相关文章:

ruby-on-rails - capybara have_field找不到have_selector找到的字段

ruby-on-rails - 安装 json Ruby gem 时出错

ruby - 导轨 3 : Use 'before_create' within a module (for ActiveRecord models)

orm - 轨道 3 : DataMapper instead of ActiveRecord

ruby-on-rails - Ruby on Rails - 无法安装 SystemTimer

ruby-on-rails - 为不同的用户配置文件设计具有多态关联的用户

ruby-on-rails - 哈希数组的 transform_keys

ruby - 在自定义 Airbrake 通知中传递环境

ruby-on-rails - Rails : Cannot have a has_many :through association before association is defined

ruby-on-rails - 如何通过 C 程序的命令行界面编译 C 程序以与我的 ruby​​ gem 一起使用?