以两种不同的方式访问has_many关系ActiveRecord Rails

时间:2011-04-18 09:55:08

标签: ruby-on-rails has-many-through

我需要以两种方式访问​​机构。 我的模型如下:

class Person < ActiveRecord::Base
  has_many :institution_people
  has_many :institution_choices
  has_many :institutions, :through => :institution_people
  has_many :institutions, :through => :institution_choices
  fields........
end

class Institution < ActiveRecord::Base
  has_many :people, :through => :institution_people
  has_many :people, :through => :institution_choices
  has_many :institution_people
  has_many :institution_choices
end

class InstitutionChoice < ActiveRecord::Base
  belongs_to :person
  belongs_to :institution
end

class InstitutionPerson < ActiveRecord::Base
  belongs_to :person
  belongs_to :institution
end

我设置这样的模型是那个人可以在不同的机构学习,所以对于这个我设置

has_many :institutions, :through => :institution_people

for person model

但与此同时,人们可以选择机构,所以我设置了

has_many :institutions, :through => :institution_choices

为个人模特。

我应该如何在人与机构之间建立模型和关联,以便我可以从两个方面找到人的机构。

现在

Person.first.institutions 

从institution_people表中查找,如

has_many :institutions, :through => :institution_people
我猜是

欢迎其他一些技术,以便我可以通过两种方式获得机构。

3 个答案:

答案 0 :(得分:1)

Person模型中,试试这个:

class Person < ActiveRecord::Base
  has_many :institution_people
  has_many :institution_choices
  has_many :institutions_people, :through => :institution_people, :source => :institutions, :class_name => "Institution"
  has_many :institutions_choices, :through => :institution_choices, :source => :institutions, :class_name => "Institution"
end

http://guides.rubyonrails.org/association_basics.html#has_many-association-reference

答案 1 :(得分:0)

基本上,你需要某种界面。我会做什么:

在机构模型中:

scope :institutions_of, proc { |person| joins(' INNER JOIN (' + Person.institution_ids(person) + ') q
  ON institutions.id = q.ip_iid OR institutions.id = q.ic_iid').where(['institutions.person_id = ?', person_id]

(它从下面的Person.rb加入查询(范围))

在Person.rb中:

    scope :institution_ids,  proc { |person| select('ip.institution_id ip_idd, ic.institution_id ic_idd
from institution_people ip
inner join institution_choice ic on ip.person_id = ic.person_id').
where(['ip.person_id = ?', person.id])

(这应该从两个表中检索所有机构ID)

像地狱一样难看,但仍然可以工作。你可以使用的是:Institution.institutions_of(current_user)

答案 2 :(得分:0)