2015-03-31 60 views
0

我的客户模型有很多视频,视频有很多视频活动。ActiveRecord通过关联多次连接

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

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

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

这是如何完成的?做VideoActivity.joins(:video).joins(:customer)给了我一个错误,说VideoActivity没有与之关联的客户。

回答

0

VideoActiviy与客户没有关系,你需要说的是,客户与视频,那么它更容易使用活动记录的#merge这样做的哈希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')) 
+0

我需要引用的客户模型电子邮件,不过视频模型中不包含客户ID。这是我的问题所在。 – parameter 2015-03-31 18:48:01

+0

我需要按属于某个视频的视频活动进行过滤,这些视频属于某个电子邮件地址为'%@ gmail.com'的客户。 – parameter 2015-03-31 18:48:33

+0

like'VideoActivity.joins(video::customer).merge(Customer.where(email:'some email'))'? – 2015-03-31 18:49:26

0

有很多方法可以做到这一点,所有这些方法都在同一个地方完成,但是使用明确的where语句将很容易实现此目标。

VideoActivity.joins(:video).where("videos.customer_id = ?", 52) 
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)