2013-01-04 64 views
0

我正在努力獲得工作範圍。我在下面列出了簡單的模型:使用範圍來檢查相關模型在Rails中是否沒有其他相關模型?

class User < ActiveRecord::Base 
    has_many :authentications 
    has_many :attendances 
end 

class Authentication < ActiveRecord::Base 
    belongs_to :user 
end 

class Attendances < ActiveRecord::Base 
    belongs_to :user 
end 

我試圖做的是寫在出勤的涵蓋範圍檢查有沒有認證的用戶。沿線的一些東西:

scope :fulfilled_without_user_authentications, lambda { includes(:authentications).where('authentications.id' => nil) } 

然而,很顯然,出席率和身份驗證之間的直接關係不存在。

我應該創建這個鏈接(使用有很多直通),或者是否有一種方法在範圍內指定它。

任何意見將不勝感激。

回答

0

編輯

試試下面,讓我知道,如果它的工作原理..

class Attendances < ActiveRecord::Base 
    belongs_to :user 
    scope :fulfilled_without_user_authentications, lambda { joins(:user => :authentications).where('authentications.user_id != users.id') } 
end 
+0

不幸的是,沒有喜悅。我回來了「沒有找到名爲'用戶'的協會,也許你拼錯了它?」 – idrysdale

+0

更新了答案 – shweta

0

也許你首先需要重新考慮你的關係。 用戶可以在沒有被認證的情況下出席嗎?

如果沒有,我會重構你的關係,「經歷過多次」:

+0

用戶可以在沒有身份驗證的情況下參加考勤。我錯過了在這裏重構的方式嗎? – idrysdale

0

好了,我看中的辦法,這樣的作品,是:

class User 
    scope :with_authentications, where("id IN (SELECT user_id FROM authentications)") 
    scope :without_authentications, where("id NOT IN (SELECT user_id FROM authentications)") 
end 

class Attendance 
    scope :with_user_authentications, lambda { 
    joins "INNER JOIN users ON users.id = attendances.attendee_id" and User.with_authentications 
    } 
    scope :without_user_authentications, lambda { 
    joins "INNER JOIN users ON users.id = attendances.attendee_id" and User.without_authentications 
    } 
end