2011-02-02 70 views
1

我的應用程序使用:has_many:通過關聯,我無法弄清楚如何最有效地加載和顯示關聯兩端的數據和關聯本身。渴望加載屬性加入模型軌道

這裏是我的課:

class Person < ActiveRecord::Base 
    has_many :people_ranks 
    has_many :ranks, :through => :people_ranks 
    has_many :institutions_people 
    has_many :institutions, :through => :institutions_people 
    belongs_to :school 
    belongs_to :department 
end 
class Institution < ActiveRecord::Base 
    has_many :institutions_people 
    has_many :people, :through => :institutions_people 
end 
class InstitutionsPerson < ActiveRecord::Base 
    belongs_to :institution 
    belongs_to :person 
end 

及其相應的模型:

create_table :people, :force => true do |t| 
     t.string :name 
     t.string :degree 
     t.integer :year_grad 
     t.integer :year_hired 
    end 
    create_table :institutions, :force => true do |t| 
     t.string :name 
     t.integer :ischool 
    end 
    create_table :institutions_people, :id => false do |t| 
     t.integer :institution_id 
     t.integer :person_id 
     t.string :rel_type 
    end 

我想說明的東西,如@ person.year_hired,@ person.institution.name一個人的機構信息,和@ person.institution.institutions_people.rel_type(其中rel_type是「畢業」或「僱傭:)」,但我知道第三部分將不起作用。在person_controller的show位中使用以下內容:

@person = Person.find(params[:id], :include => [:school, :department, :institutions_people, :people_ranks, {:institutions_people => :institution}, {:people_ranks => :rank}]) 

使我可以訪問@ person.institutions和@ person.institutions_people,但是如何將連接的rel_type屬性連接到人 - 機構關係? (我來自PHP,現在如何構建SQL並通過它循環,但RoR讓我難住。)

我在「急切加載」和「與:has_many:通過關聯尋找幫助「,但我得到關於建立協會的答案。我的問題實際上是在關聯數據存在後訪問關聯數據。我的應用使用靜態數據,我並不擔心更新,銷燬或創建方法。感謝您的幫助!

回答

0

訪問數據的方式是通過institutions_people關聯。所以,你會做這樣的事情:

me = Person.first 
rel = me.institutions_people.first 

然後在視圖

<%= rel.rel_type %> from <%= rel.institution.name %> 

或者,你可以給自己機構的完整列表,與他們的信息一起:

me = Person.first 

然後在視圖中:

<% for ip in me.institutions_people %> 
    <%= ip.rel_type %> from <%= ip.institution.name %> 
<% end %> 
+0

Thanks @Rick我最終使用@rel_inst = @ me.institutions_people立即獲得了許多機構。奇蹟般有效。我感謝您的幫助! – Libby 2011-02-08 21:28:57