使用 ActiveRecord 查找 5 个嵌套表的结果

Posted

技术标签:

【中文标题】使用 ActiveRecord 查找 5 个嵌套表的结果【英文标题】:Use ActiveRecord to Find Result of 5 Nested Tables 【发布时间】:2010-02-03 00:52:16 【问题描述】:

我有一个用户模型(:name, :password, :email),以及事件模型(:name, :etc) 和兴趣模型(:name)

然后我创建了两个连接表 -> UsersInterests 和 EventsInterests;每个不包含主键,仅分别由 user_id/interest_id 和 event_id/interest_id 组成。

我正在尝试使用 ActiveRecord 查询所有事件的列表,其中 EventsInterests 的 interest.id= UsersInterests 的 interest.id

我正在使用 has_many 和 belongs_to 与 Nested Loop Plugin 的关系

我的模型看起来像这样 =>

用户.rb

has_many :users_interests
has_many :interests, :through => :users_interests

事件.rb

has_many :events_interests
has_many :interests, :through => :events_interests

兴趣.rb

belongs_to :users , :through => :users_interests
belongs_to :events , :through => :events_interests

users_interests.rb

belongs_to :users
belongs_to :interests

events_interests.rb

belongs_to :interests
belongs_to :events

如果@user= User.find(1),我将如何查询用户感兴趣的事件?

我想出了这个 => @events.find(:all, :conditions => EventsInterests.interest_id = UsersInterests.interest_id) ??

但我得到了错误

undefined method `interest_id' for UsersInterests(user_id: integer, interest_id: integer):Class

嗯..wtf?任何帮助家伙....我已经在这个 4 天了

【问题讨论】:

【参考方案1】:

首先,进入控制台并确保您的所有关系都有效:

User.first.events
User.first.interests
Events.first.users
Interests.first.users
Interests.first.events
# ... and so

澄清一下,用户列出了他的兴趣,而您想要获得与这些兴趣相匹配的事件列表?

User.first.interests.collect  |interest| interest.events .uniq

不是特别有效,但有效且易于理解。

您也可以使用User.first.interests_singular_ids 获取ID,并将其传递给带有interest_id IN(...) 列表的find()。不过,我不确定它会快多少。

【讨论】:

以上是关于使用 ActiveRecord 查找 5 个嵌套表的结果的主要内容,如果未能解决你的问题,请参考以下文章

Rails:使用 where 子句查找深度嵌套的关联

按指定顺序按 id 查找 ActiveRecord 对象的干净方法

如何使用 ActiveRecord :: 嵌套属性进行多重关联

使用 Arel 进行嵌套集和连接查询并转换为 ActiveRecord::Relation

具有 3 个级别的 MongoDB 嵌套查找

Has_Many 通过关联和嵌套属性