2015-03-31 113 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)