ActiveRecord通过关联进行多个连接

时间:2015-03-31 18:38:08

标签: sql ruby-on-rails join activerecord

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

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

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

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

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

3 个答案:

答案 0 :(得分:0)

有很多方法可以做到这一点,并且最终都在同一个地方,但使用明确的where语句将很容易实现这一目标。

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

答案 1 :(得分:0)

VideoActiviy与客户没有任何关系,您需要说客户与视频相关,然后更容易使用活动记录#merge进行哈希{{1} }}

where

如果你在视频中有一个范围,你也可以使用它,这是一个例子

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

<强> PS:

范围可以是

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

然后使用它

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

答案 2 :(得分:0)

您可以编写普通的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)