ActiveRecord 多连接通过关联

ActiveRecord multiple joins through association

我的客户模型有很多视频,视频有很多视频活动。

我想加入视频活动以限制属于具有特定电子邮件域的客户的视频。

此代码将向我提供属于 ID 为 52 的客户的所有视频活动,但由于视频没有客户电子邮件,我需要将客户加入视频,然后执行 .where。

VideoActivity.joins(:video).where(videos: {customer_id: 52})

这是怎么做到的? VideoActivity.joins(:video).joins(:customer) 给我一个错误,提示 VideoActivity 没有与之关联的客户。

有很多方法可以做到这一点,所有方法都在同一个地方结束,但是使用明确的 where 语句可以轻松实现这个目标。

   VideoActivity.joins(:video).where("videos.customer_id = ?", 52)

VideoActiviy 跟customer 没有关系,你要说customer 和video 有关系,那用active record 的#merge 做hash 比较简单where

VideoActivity.joins(video: :customer).merge(Customer.where('some condition'))

如果您有视频范围,您也可以使用它,这里是一个示例

VideoActivity.joins(video: :customer).merge(Customer.some_scope)

PS:

范围可以是

# customer model
scope :email_ends_with, ->(string) { where('email ilike ?', "%#{string}") }

那就用吧

VideoActivity.joins(video: :customer).merge(Customer.email_ends_with('gmail.com'))

您可以编写简单的 sql 来获取记录

activities = VideoActivity.joins('INNER JOIN videos ON video_activities.video_id = videos.id INNER JOIN customers ON videos.customer_id = customers.id')
activities.where('customers.email = ?', customer_email)