【问题标题】:has_one through association with conditionhas_one 通过与条件的关联
【发布时间】:2018-03-19 15:20:28
【问题描述】:

我有 3 个相关的表格/模型。我想检索组织聚会的用户,给定一个聚会记录、一个带有布尔值organized 列的连接表和一个用户表。

到目前为止我最好的尝试(在 much 摆弄之后,这对我来说最有意义)。我省略了不相关的列。

class Party
  # party_id

  has_many   :parties_users
  has_many   :users, through: :parties_users, source: :user
  has_one    :organizer,
             -> { where organizer: true },
             through: :parties_users,
             source: :user

class PartiesUser
  # party_id
  # user_id
  # organized:bool

  belongs_to :party
  belongs_to :user

class User
  # user_id
  has_many : parties_users

上述设置引发了以下错误,老实说,我并不完全理解: ActiveRecord::HasOneThroughCantAssociateThroughCollection (Cannot have a has_one :through association 'Party#organizer' where the :through association 'Party#parties_users' is a collection. Specify a has_one or belongs_to association in the :through option instead.)

我知道我可以通过实例方法来做到这一点,但考虑到使用频率类型,我的应用程序将极大地受益于将其作为关联。

【问题讨论】:

  • 我觉得parties_users 不应该包含与谁组织聚会有关的数据,但聚会本身应该有belongs_to :organizer, class_name: 'User'(或者如果你想要多对-很多)
  • 这实际上是我目前的实现,但它也导致了一堆混乱的查询,我必须手动合并连接表中的用户和组织者

标签: ruby-on-rails activerecord ruby-on-rails-5 rails-activerecord


【解决方案1】:

正如错误消息所说,您不能通过 has_many 获得 has_one。

如果组织者标志在加入记录上,您可以(相反)这样做...

has_many :parties_users
has_many :users, through: :parties_users, source: :user
has_one :main_party_user, -> {where organizer: true}, class_name: 'PartiesUser'
has_one :organizer, through: :main_party_user, class_name: 'User'

【讨论】:

  • 这行得通!但是,source: :enthusiast 必须在最后一行提供
  • 我觉得应该是source: :user而不是class_name: 'User'
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2017-11-12
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多