Ruby on rails 铁路及;活动记录:如何连接仅通过另一个表相关的表?

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

我正在尝试使用贯穿表关联构建活动记录查询。以下是我的模型:

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
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)