2014-01-14 134 views
0

這裏使用的條件是一個示例獲取記錄:一個用戶有很多汽車汽車屬於用戶的ActiveRecord的Rails:在關係

我想提取所有的汽車信息,但不是某些用戶的汽車(這是因爲我想刪除我和一些同事創建正確的統計信息)。

我想這一點,但沒有成功:

Car.where("car.user.name != 'john'") 

任何想法?你有關於獲得關係條件記錄的一般規則嗎?

謝謝。

回答

2

嘗試follwing:

Car.where('user_id != ?', User.find_by_<name?>('john').id 

如果你有軌道4:

Car.where.not(user_id: User.find_by(name: 'john')).id 

UPDATE:

上述解決方案將工作,因爲你有你就可以查詢外鍵。更一般的解決方案是使用關聯表執行左連接並過濾這些結果。下面的工作,無論關聯類型(包括的has_many:通過和has_and_belongs_to_many):

Car.includes(:user).where('users.name != ?', 'john') 

# rails 4 

Car.includes(:user).where.not(users: { name: 'john'}) 
0

Car.joins([:user]).where("users.name != 'John'") 

試試如果你需要所有喜歡users.name用戶信息的汽車信息,那麼你可以有

Car.joins([:user]).select('cars.*, users.name AS user_name').where("users.name != 'John'") 

上面做的事情有一個SQL查詢

SELECT cars.*, users.name AS user_name FROM `cars` INNER JOIN `users` ON `users`.`id` = `cars`.`user_id` WHERE (users.name != 'John') 
+0

這不會沒有用戶返回汽車。 – BroiSatse

+0

是的,我將添加包含,但您剛剛在答案中指定了它。 –

0
Car.includes(:users).where("users.name NOT IN ('bill','peter','joe') OR cars.user_id IS NULL") 

將返回不屬於用戶所有的汽車,沒有那個是比爾,彼得還是喬用戶名,並且還車!