2012-06-25 170 views
0

需要Activerecord的一些幫助在has_many:through關聯中查詢。Rails Activerecord查詢has_many:通過

型號:

工作

class Job < ActiveRecord::Base 
    has_many :job_metadata, :dependent => :destroy 
    has_many :metadata, :through => :job_metadata 

元數據

class Metadatum < ActiveRecord::Base 
    attr_accessible :description, :metadata_type_id 
    has_one :metadatum_type 
    has_many :job_metadata, :dependent => :destroy 
    has_many :jobs, :through => :job_metadata 

MetadatumType

class MetadatumType < ActiveRecord::Base 
    attr_accessible :description 
    has_many :metada 

JobMetadatum

class JobMetadatum < ActiveRecord::Base 
    attr_accessible :job_id, :metadatum_id 
    belongs_to :job 
    belongs_to :metadatum 

在控制檯中,我可以運行:

@job.metadata 

返回

=> [#<Metadatum id: 2, description: "Part Time", metadatum_type_id: 1, created_at: "2012-06-23 20:42:14", updated_at: "2012-06-23 20:42:14">] 

但我會怎麼回報@ jobs.metadata的metadatum_id其中有一個metadatum_type_id = 1?

我想這一點:

@job.metadata.metadatum_id.where('metadata.metadatum_type_id' => 1) 

但得到以下錯誤:

NoMethodError: Metadatum Load (0.3ms) SELECT "metadata".* FROM 
"metadata" INNER JOIN "job_metadata" ON "metadata"."id" = 
"job_metadata"."metadatum_id" WHERE "job_metadata"."job_id" = 31 
undefined method `metadatum_id' 
for #<ActiveRecord::Relation:0x007f7fb3188de8> 
+0

約has_any最關鍵的事情:通過對實際獲得的型號名稱權開始。元數據和元數據非常非英語。我會首先想出更好的名字。我從經驗中學到了這一點。 –

+0

謝謝邁克爾。鑑於我正在努力完成的任務,我很樂意爲這些模型命名。 – cman77

回答

1

試試這個

@the_metadatum_record = @job.metadata.where("metadatum_type_id = 1").first 

這通過搜索屬於@job的元數據記錄,然後查看這些記錄以查找具有1的metadatum_type_id的記錄。

然後ID可以像@the_metadatum_record.id

訪問的「第一」被添加到年底,因爲如果你的工作有1型的多於一個元數據,查詢將返回所有的人。

而且,我同意邁克爾,這些都是那種對錶可怕的名字......

+0

謝謝。你會推薦什麼命名約定。這些表本質上可以存儲與不同類型的作業相關的數據。希望避免使用此體系結構的每種數據類型(作業類型,類別,行業等)的大量個人表關係。但打開一個更好的命名約定! – cman77

+0

好吧,如果每個工作都有工作類型,類別和行業,我會將所有這些列作爲列添加到您的工作表中。否則,你可能會創建一個Detail模型,甚至是JobDetail。這樣,當你查詢元數據記錄ID之類的東西時,它看起來像'@ job.job_details.where(「job_detail_type = 1」)'。這只是更具可讀性 –

+0

Thx的建議 - 將實施....同意100%的可讀性! – cman77