我需要以两种方式访问机构。 我的模型如下:
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
我猜是。
欢迎其他一些技术,以便我可以通过两种方式获得机构。
答案 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)