has_one通过与条件关联

Dan*_*Dan 6 activerecord ruby-on-rails rails-activerecord ruby-on-rails-5

我有3个相关的表格/模型。我想检索已组织了party的用户,给定Party记录,带有布尔organized列的联接表,以及users表。

我最好的尝试,到目前为止(这个是很有道理的我以后多摆弄)。我省略了不相关的列。

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
Run Code Online (Sandbox Code Playgroud)
class PartiesUser
  # party_id
  # user_id
  # organized:bool

  belongs_to :party
  belongs_to :user
Run Code Online (Sandbox Code Playgroud)
class User
  # user_id
  has_many : parties_users
Run Code Online (Sandbox Code Playgroud)

上面的设置引发以下错误,老实说,我并没有完全理解: 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.)

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

Ste*_*zyn 9

如错误消息所述,您不能通过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'
Run Code Online (Sandbox Code Playgroud)

  • 这有效!但是,必须在最后一行提供`source:: :爱好者` (2认同)