簡體   English   中英

在has_many中,ActiveRecord關聯的條件在哪里相互沖突?

[英]Where conditions on ActiveRecord associations conflicting with each other in has_many through?

在我的應用程序(Rails 4.2.0.rc2)中,用戶可以是給定機構的學生或管理員。 User上有一個關聯:admin_institutions ,通過檢查其在聯接表中的role來返回用戶所管理的所有機構。 還有一個協會:studentsInstitution返回所有誰是學生該機構的用戶,再根據institution_users.role

這些關聯按預期工作,因此我向User添加了一個關聯:admin_students ,以返回給定用戶為admin的所有機構的所有學生。

class InstitutionUser < ActiveRecord::Base
  belongs_to :institution
  belongs_to :user
end

class Institution < ActiveRecord::Base
  has_many :institution_users
  has_many :users, :through => :institution_users
  has_many :students, -> { where "institution_users.role = 'Student'" }, :through => :institution_users, source: :user
  ...
end

class User < ActiveRecord::Base
  has_many :institution_users
  has_many :admin_institutions, -> { where "institution_users.role = 'Admin'" }, through: :institution_users, source: :institution
  has_many :admin_students, through: :admin_institutions, source: :students
  ...
end

但是, :admin_students無法正常工作。 它生成以下SQL:

選擇“用戶”。*從“用戶” INNER JOIN“ institution_users”在“用戶”上。“ id” =“ institution_users”。“ user_id”在INNER JOIN“機構”在“ institution_users”上。“ institution_id” =“機構”。“ id“ INNER JOIN” institution_users“” institution_users_admin_students_join“ ON”機構“。” id“ =” institution_users_admin_students_join“。” institution_id“ WHERE” institution_users_admin_students_join“。” user_id“ = $ 1 AND(institution_user)。角色='管理員')[[[“ user_id”,190]]

它似乎不是在尋找用戶是管理員的所有機構並選擇所有學生,而是在尋找用戶既是學生又是管理員的機構,因此它返回一個空集合。

有沒有一種方法可以編寫一個關聯(而不是一個方法),它可以給我想要的結果,而我的條件不會像這樣發生沖突?

(旁注:這是這種關聯的預期行為嗎?如果是這樣,我真的很感謝進一步了解ActiveRecord為什么以這種方式解釋它。)

這可能不是答案,但也許會得出答案。

我不喜歡與硬編碼的SQL關聯:

-> { where "institution_users.role = 'Student'" }

它們肯定至少是問題的一部分,因為ActiveRecord無法解釋它們,無法確定stitutional_users要將其應用到哪個表別名。

您可以通過引用InsitutionUser模型的類方法來使ActiveRecord具有這種靈活性:

def self.students
  where(role: "Student")
end

這也使InstitutionUser邏輯保持一處。

然后關聯變為:

has_many :students, -> {merge(InstitutionUser.students)}, :through => :institution_users, source: :user

也許嘗試一下,看看是否能為您解決問題,否則,可能會使事情朝着正確的方向發展。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM