Ruby on rails 铁路及;活动记录:如何连接仅通过另一个表相关的表?
我正在尝试使用贯穿表关联构建活动记录查询。以下是我的模型: Event.rb:Ruby on rails 铁路及;活动记录:如何连接仅通过另一个表相关的表?,ruby-on-rails,activerecord,Ruby On Rails,Activerecord,我正在尝试使用贯穿表关联构建活动记录查询。以下是我的模型: Event.rb: has_many :event_keywords User.rb: has_many :user_keywords 关键字.rb: has_many :event_keywords has_many :user_keywords belongs_to :event belongs_to :keyword belongs_to :user belongs_to :keyword EventKeyword.rb
has_many :event_keywords
User.rb:
has_many :user_keywords
关键字.rb:
has_many :event_keywords
has_many :user_keywords
belongs_to :event
belongs_to :keyword
belongs_to :user
belongs_to :keyword
EventKeyword.rb:
has_many :event_keywords
has_many :user_keywords
belongs_to :event
belongs_to :keyword
belongs_to :user
belongs_to :keyword
UserKeyword.rb:
has_many :event_keywords
has_many :user_keywords
belongs_to :event
belongs_to :keyword
belongs_to :user
belongs_to :keyword
我正在尝试构建一个事件范围,该范围将用户id作为参数,并使用共享关键字返回所有事件。这是我的尝试,但它无法识别用户\u关键字关联:
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")
}
如何解决此问题?类似的方法可能会奏效。两步法。首先,获取所有用户的关键字。然后查找具有相同关键字的所有事件
scope :with_keywords_in_common, ->(user) {
joins(:event_keywords).
where("event_keywords.keyword_id" => user.user_keywords.pluck(:id))
}
这里的数据库似乎有些过分,首先我要简化,使关键字具有多态性,这样就可以去掉这里的两个表(
event\u keywords
,和user\u 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
为了简单起见,我没有在问题中加入额外的表格还有其他原因。你知道如果我保持数据库设置不变,你会如何构建这个作用域吗?下面是一个尝试,但找不到你的
用户\u关联
表的原因是因为它是一个嵌套表。尽管Sergio的答案会起作用,但它可能会通过嵌套联接进一步优化。这里有一个链接让你开始,但没有你的表格和数据,我无法测试任何东西。太棒了,这看起来太完美了!我只需要将user.user\u keywords.pull(:id)更改为user.user\u keywords.pull(:keyword\u id)