2012-11-25 46 views
0

能不能幫我寫以下範圍:如何用關聯編寫範圍?

Cv belongs_to的Student,我想寫範圍,給了我這裏的學生至少有一個 教育(student.edcuations.any?)和學生是有效的所有CV(已全部屬性填寫)

我想爲Cv寫這個範圍。

模型

#cv.rb 
belongs_to :student 

#student.rb 
has_many :cvs 
has_many :educations 

回答

3

我想我誤解你的車型的佈局。

我覺得它應該看起來更像是這個,因爲每個CV會教育上市(否則,如何在數據庫中的相互連接)

#cv.rb 
belongs_to :student 
has_many :educations 

#student.rb 
has_many :cvs 

#education.rb 
belongs_to :cvs 

我可能只用一個類方法雖然。

#student.rb 
def cvs_with_education 
    self.cvs.reject {|cv| cv.educations.empty?} 
end 
+0

學生有很多教育,因爲教育包含他的部門和學院。學生可以有很多教育。我很確定。 – tomekfranek

+0

啊,這很公平,我誤解了教育表的重點(缺乏信息)。 您是否試圖爲所有定義了一種教育的學生返回所有cvs,或者只有一名學生至少接受過一次教育的cvs? –

+0

對於所有的學生,這就是爲什麼我想到了範圍 – tomekfranek

0

查看ActieRecord Query Interface Guide的第11.2.3節關於如何加入嵌套關聯。

喜歡的東西

scope :with_education, joins(:student => :educations).where("some conditions") 

你可能要定義一個:valid_student範圍,然後利用該範圍內。

+0

valid_student是檢查每個屬性的更好方法嗎? ''範圍:with_valid_student,連接(:學生).where('名字不是空和名字不是空和電子郵件是非空(...等)')' – tomekfranek

+0

嗯,首先,我會問自己,如果首先,數據庫中應該存在無效的學生。也許你應該向Student類添加驗證,以便只能創建有效的記錄。除此之外,答案几乎不是。 ActiveRecord'where'方法相當有限。雖然有寶石可以給你更多的權力。看看MetaWhere。 – vpsz