2014-01-10 96 views
1

我有一個用戶模式是這樣的:檢查是否存在關聯

has_one :car 

和汽車模型:

belongs_to :user 

如何檢查哪些用戶沒有車?

+0

你想檢查它在哪裏?在測試中,在驗證?你想實現什麼? –

+0

@SimoneCarletti他們應該被驗證覆蓋,但仍然有案件,我試圖找出損壞 – London

+1

如果你想檢查用戶是否有車,那麼'@ user.car.blank?'將返回true if用戶不擁有汽車。或者,如果你想獲得所有沒有車的用戶,那麼'User.where(id:Car.pluck(:user_id).uniq)' –

回答

4

你可以寫這樣的查詢:

User.includes(:car).where(cars: {user_id: nil}) 

我會建議它提取到一個範圍:

class User < ActiveRecord::Base 
    # ... 

    def self.without_car 
    includes(:car).where(cars: {user_id: nil}) 
    end 
end 

然後,你可以簡單地寫

User.without_car 

編輯

爲了澄清:在幕後,這個查詢會發出:

SELECT "users"."name" FROM "users" 
LEFT OUTER JOIN "cars" ON "cars"."user_id" = "users"."id" 
WHERE "cars"."user_id" IS NULL 

的加入將導致一個空行的car.user_id的,所以我們可以簡單的檢查,如果該行是NULL(或者,從Active記錄的觀點,nil)。

順便說一下,這也適用於has_many關係,只需將參數更改爲includes以複數形式。請注意,where的參數總是需要複數,因爲它是表名。

+0

是真的叫做範圍嗎? – devanand

+0

@devanand我想這是一個歷史長大的名字,請參閱http://edgeguides.rubyonrails.org/active_record_querying.html#scopes –

+0

可能downvoter如此善良,並解釋這是什麼問題?我想改善我的答案。 –