0

我正在嘗試使用RoR創建以下基本結構。關鍵是所有的用戶都可以鏈接到學校和專業。用戶將根據他們的學校和專業撰寫文章。鏈接不是唯一的:許多用戶可以在許多學校中的一個,也可以是許多專業之一。但是,每個用戶不能在一個以上的學校,並且不能在一個以上的專業。最後,我想能夠顯示基於以下職位/過濾器的文章:兩個鏈接模型+用戶模型?

  • 所有用戶在主要X,並在學校ÿ
  • 在學校Ÿ所有專業
  • 所有學校與主要X

我已經做了一些研究,不知道是否有任何這是正確的... (仍在學習)我應該用比下面HAS_MANY has_and_belongs_to_many?

major_schools #(linking the two models below) 

模式

class School < ActiveRecord::Base 
    has_many :major_schools 
    has_many :majors, :through => :major_schools 
end 

class Major < ActiveRecord::Base 
    has_many :major_schools 
    has_many :schools, :through => major_schools 
end 



@school.majors #now gives a list of all the majors this school has 
@major.schools #still gives a list of all schools that have this major 

我需要做的是還包括與上述兩個用戶模型什麼:

class User < ActiveRecord::Base 

    has_and_belongs_to_many :major_schools 

end 

而且我相當卡住...怎麼樣我可以將用戶模型數據提交給上述模型嗎?

+1

專業可以成爲不止一個學校的一部分?這看起來不正確。 – Shane

+0

謝恩,是的 - 例如,「網頁設計」專業或「歷史」專業或「時尚」專業或「廣告和營銷」專業 - 他們不是學校專用 – Caroline

回答

1

您的域模型在這裏有點糾結,但它的工作原理。

這裏是加載在兩個主要的所有用戶ID爲X,並在學校id爲Y的一個辦法:

class MajorSchool < ActiveRecord::Base 
    belongs_to :major 
    belongs_to :school 

    has_and_belongs_to_many :users 
end 

# Load all users from this school/major combination 
MajorSchool.where(major_id: X, school_id: Y).users 
1

爲什麼不能簡單地做:

class School < ActiveRecord::Base 
    has_many :major_schools 
    has_many :majors, :through => :major_schools 
    has_many :users 
end 

class Major < ActiveRecord::Base 
    has_many :major_schools 
    has_many :schools, :through => major_schools 
    has_many :users 
end 

class User < ActiveRecord::Base 
    belongs_to :school 
    belongs_to :major 
end 

那麼你應該能夠做:

# all students of the school 
@school.users 

# all students of the school and major (each line should return the same results) 
@school.users.where(major_id: @major.id) 
@major.users.where(school_id: @school.id) 
User.where(school_id: @school.id, major_id: @major.id) 
+0

謝謝jacovac。問題,爲什麼不適合使用has_and_belongs_to_many:用戶(對於最後一個has_many:用戶)? – Caroline

+1

根據你的問題,你想定義什麼是每個模型學校有很多模型用戶,每個模型用戶都屬於一個學校。 'has_and_belongs_to_many'被用作_m到n_關聯的簡寫。所以如果你不想要任何額外的模型,你可以用你的學校和主要模型替換前兩個has_many。有關[指南]中的更多信息(http://guides.rubyonrails.org/association_basics.html#choosing-between-has-many-through-and-has-and-belongs-to-many)。 –