2016-10-20 28 views
1

我想通过表关联建立一个活动的记录查询。这里是我的模型:Rails&Active Record:如何连接仅通过另一个表关联的表?

Event.rb:

has_many :event_keywords 

User.rb:

has_many :user_keywords 

Keyword.rb:

has_many :event_keywords 
has_many :user_keywords 

EventKeyword.rb:

belongs_to :event 
belongs_to :keyword 

UserKeyword.rb:

belongs_to :user 
belongs_to :keyword 

我试图建立一个事件作用域需要为user_id为PARAM并返回所有共享关键字的事件。这是我的尝试,但它不承认user_keywords协会:

scope :with_keywords_in_common, ->(user_id) { 
    joins(:event_keywords).joins(:user_keywords) 
    .where("user_keywords.user_id = ?", user_id) 
    .where("event_keywords.keyword_id = user_keywords.keyword_id") 
    } 

如何解决此问题?

回答

1

这样的事情可能会奏效。两步过程。首先,获取所有用户的关键字。然后找到所有具有相同关键字的事件。

scope :with_keywords_in_common, ->(user) { 
    joins(:event_keywords). 
    where("event_keywords.keyword_id" => user.user_keywords.pluck(:id)) 
} 
+1

真棒,这看起来很完美!我必须改变的是user.user_keywords.pluck(:id)到user.user_keywords.pluck(:keyword_id) –

0

数据库似乎是矫枉过正这里首先我想通过使关键字多态性简化,这将摆脱你的表2这里(event_keywordsuser_keywords)。然后

你的协会应该是这样的:

# Event.rb: 
has_many :keywords, as: keywordable 

# User.rb: 
has_many :keywords, as: keywordable 

# Keyword.rb: 
belongs_to :keywordable, polymorphic: true 

最后,你的范围:

scope :with_keywords_in_common, -> (user_id) do 
    joins(:keywords) 
    .where('keywords.keywordable_type = User AND keywords.word IN (?)', keywords.pluck(:name)) 
end 
+0

还有其他原因让我在问题中没有包含额外的表格,以保持简单。如果我保持数据库设置相同,你知道如何构建这个范围吗? –

+0

这是一个尝试,但是你找不到'user_assocations'表是因为它是一个嵌套表。虽然塞尔吉奥的答案会起作用,但它可能会通过嵌套连接进一步优化。这里有一个链接,让你开始,但没有你的表和数据,我无法测试任何东西。 http://stackoverflow.com/questions/16131201/multiple-table-joins-in-rails – Jeff

相关问题