2013-04-19 65 views
0

我正在研究一個由學校,學生和文章組成的項目。當我開始開發我的文章控制器時,我意識到必須有更好的方式來完成我的目標,但我沒有經驗來弄清楚。基本上我想要做的是讓我的用戶註冊某個學校。然後,一旦用戶登錄,他應該能夠看到他的學校和類別的所有文章。這裏是我的設置,任何意見,將不勝感激:Rails複雜的數據庫關係

school.rb:

class School < ActiveRecord::Base 
    has_many :users 
    has_many :articles, :through => :users 
    attr_accessible :name 
end 

user.rb:

class User < ActiveRecord::Base 
    belongs_to :school 
    has_many :articles 
    attr_accessible :first_name, :last_name, :email, :password, :password_confirmation, :remember_me, :provider, :uid, :school_id 
end 

category.rb:

class Category < ActiveRecord::Base 
    attr_accessible :name 
    has_many :articles 
    accepts_nested_attributes_for :articles 
end 

文章。 rb:

class Article < ActiveRecord::Base 
    attr_accessible :body 
    belongs_to :category 
    belongs_to :user 
end 

這似乎是一個很好的設置來完成我的目標?先謝謝了。

+1

用戶和文章之間的關係是什麼?用戶是否創建文章,或只是閱讀他們(或兩者)? –

回答

1

雖然一切看起來都不錯,但我建議將文章直接鏈接到學校以及用戶。所以,你最終的東西,如:

# school.rb 
has_many :users 
has_many :articles 

# user.rb: 
belongs_to :school 
has_many :articles 

# category.rb: 
has_many :articles 

# article.rb: 
belongs_to :category 
belongs_to :user 
belongs_to :school 

直接鏈接到學校的文章更有意義,從一個造型上看。目前,你的結構表明一篇文章屬於其用戶當前所屬的學校;雖然這可能通常有效,但從長遠來看,您可能最終付出代價是一個額外的脆弱點。

鑑於這聽起來像是用戶瀏覽學校文章的主要活動之一,它也使應用程序加載這些文章的過程複雜化。使用您當前的結構,將採取以下步驟:

  1. 查找當前用戶的學校。
  2. 找到屬於該學校的每個用戶。
  3. 找到每個用戶寫的每篇文章。

將文章直接鏈接到學校將切斷第二步,這會讓您的表現自由增加,尤其是當您獲得大量用戶和文章時。

+0

非常感謝你的回答。我會在早上解決所有問題,然後開始測試。我也將移除accep_nested_attributes,如@Ajcodez所示。現在你提到它了,一切都變得更有意義。 –

1

accepts_nested_attributes_for :articles感覺像是一個錯誤。此外,對我來說看起來很好,假設用戶正在創建文章。

我認爲有幾個問題需要考慮用戶的文章。恰巧如果用戶的文章是什麼?

  • 刪除他/她的賬戶
  • 接送學校
  • 畢業學校完全

或許因爲這些原因,學校應該有文章直出而不是通過用戶。但取決於你希望如何工作。


您可能還想重新考慮與類別和文章的一對多關係。通常,它更容易使用標籤系統,在工作和類別之間具有多對多的關係。

想象一下,如果這篇文章是關於風力發電的貨運回報。它可能屬於國際商業和技術類別。


編寫一些測試,瞭解您希望類如何工作,並讓它指導您的設計細節。

+0

謝謝!您的反饋以及Zaid的幫助非常有幫助,我非常感謝。 –