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)
我的客户模型有很多视频,视频有很多视频活动。
我想加入视频活动以限制属于具有特定电子邮件域的客户的视频。
此代码将向我提供属于 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)