我有3个模特:卫报,学生和组织。 Guardian通过链接模型连接到Student,类似地,Student通过链接模型连接到Organization。我需要为每个监护人,一系列(不同的)组织提供帮助,并且我想知道最好的方法是什么。
目前我在Guardian类的应用程序级别执行此操作
def organizations
orgs = []
students.each do |s|
s.organizations.each do |o|
orgs << o if !orgs.include?(o)
end
end
orgs
end
我想知道是否有更好的方法来做到这一点,最好是在数据库级别。任何帮助将不胜感激。
编辑:这里有我的模型的更详细描述
class Person < ActiveRecord::Base
end
class Guardian < Person
has_many :student_guardian_links, inverse_of: :guardian, dependent: :destroy
has_many :students, through: :student_guardian_links, inverse_of: :guardians
end
class Student < Person
has_many :student_guardian_links, inverse_of: :student, dependent: :destroy
has_many :guardians, through: :student_guardian_links, inverse_of: :students
has_many :student_organization_links, inverse_of: :student, dependent: :destroy
has_many :organizations, through: :student_organization_links
end
class Organization < ActiveRecord::Base
has_many :student_organization_links, inverse_of: :organization, dependent: :destroy
has_many :students, through: :student_organization_links, inverse_of: :organizations
end
答案 0 :(得分:0)
这应该有效:
students.map { |student| student.orgs }.flatten.uniq
你采取的方法实际上是一样的。只是使用更实用的方法。
答案 1 :(得分:0)
通过关系数据库,通常可以从目标集中进行思考。因此,您希望组织具有特定条件(他们让学生与特定监护人联系)
在ActiveRecord中,我们有joins
。它是一个错误名称,因为您仍然只获得组织对象,它只使用SQL连接从数据库中获取它们,并且您可以在连接对象上指定条件。
在“加入嵌套关联”和“在连接表上指定条件”中查看http://guides.rubyonrails.org/active_record_querying.html
因此,根据您的确切模型(请记住您需要向后连接),它可能如下所示:
Organinisation.joins(:students).where('student.guardian_id' => mygivenguardian.id).distinct()
当联接可以导致行的倍增时, distinct
很重要,例如当监护人与多个学生连接到组织时。
答案 2 :(得分:0)
试试这个:
class Guardian < ActiveRecord::Base
has_many :organizations,
:through => :students
# Your existing relationships go here
end
通过这种方式,您只需调用guardian.organizations.uniq
即可获取与特定Guardian对象关联的不同组织的列表。