在连接模型轨道中使用属性进行加载

时间:2011-02-02 21:45:58

标签: ruby-on-rails associations eager-loading

我的应用使用了: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是&#34;毕业&#)来显示一个人的机构信息。 34;或&#34;雇用:),但我知道第三部分不会工作。在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属性连接到person-institution关系? (我来自PHP,现在如何构建SQL并在那里循环,但是RoR让我感到难过。)

我已经在#34; eager loading&#34;下寻求帮助。和&#34;关联:has_many:通过&#34;,但我得到了关于构建关联的答案。我的问题是关于在关联数据存在后访问该数据。我的应用程序使用静态数据,我并不担心更新,销毁或创建方法。谢谢你的帮助!

1 个答案:

答案 0 :(得分: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 %>