2014-10-10 71 views
0

我有一個Rails應用程序使用Postgres和Active Record,無法瞭解我的模型之間最有效的關聯。Rails Active記錄多個關聯

我有一個叫做文章的模型。文章需要有格式和2/3 類型。

我需要的文章,能夠通過格式即http://myapp.com/format/format-id/article-id

我也需要文章中列出按類型來上市,所以:myapp.com/genre/genre-name/article-id

我認爲流派和格式本身就是模型本身,其中has_many_and_belongs_to與文章的關聯。每篇文章有多種流派和1種格式,但每種流派都有多篇文章。

我知道這應該很簡單,但我找不到最有效的途徑。

回答

0

有一個老Railscasts插曲通過兩種方式與Rails進行多對多的關聯 - 你應該看它:http://railscasts.com/episodes/47-two-many-to-many。這是舊的,但大多仍然相關。

所以,你有文章,格式和流派。由於每篇文章只有一種格式,因此您不需要has_and_belongs_to_many關係。條款belongs_to格式和格式has_many條款。

文章列表中的每一行都會有一個format_id字段來表示它屬於哪種格式。

流派和文章之間的關係是多對多的,這有點棘手。在數據庫級別,這需要一個「連接表」。你的連接表將被稱爲類似articles_genres,並且每行表示一個特定文章所具有的一種流派。所以,它會有一個genre_id列和一個article_id列。

在軌道方面,有兩種方法可以做到這一點:

  1. 給了articles_genres表它自己的模式。在這種情況下,您可能還需要爲表格指定一個不同的名稱,以表明它是一個模型,而不僅僅是一個連接表。你可以這樣稱呼它genreizations
  2. 不要給articles_genres表它是自己的模型,並讓rails處理它。

我一般比較喜歡第一種方式 - 我覺得控制力更強,而且將來會讓事情更加靈活。但是,要麼會奏效。我鏈接到的railscasts插曲描述了兩種方式。

如果你去的第一種方式,這是你所擁有的車型:

class Article < ActiveRecord::Base 
    has_many :genreizations 
    has_many :genres, through: :genreizations 
    belongs_to :format 
end 

class Format < ActiveRecord::Base 
    has_many :articles 
end 

class Genreization < ActiveRecord::Base 
    belongs_to :article 
    belongs_to :genre 
end 

class Genre < ActiveRecord::Base 
    has_many :genreizations 
    has_many :articles, through: :genreizations 
end 

而在第二個辦法,這就是你有哪些車型:

class Article < ActiveRecord::Base 
    has_and_belongs_to_many :genres 
    belongs_to :format 
end 

class Format < ActiveRecord::Base 
    has_many :articles 
end 

class Genre < ActiveRecord::Base 
    has_and_belongs_to_many :articles 
end 
+0

三江源所以很多,這正是我正在尋找的!我想我會選擇第一條路線,以減輕Rails的負擔。再次感謝! – 2014-10-11 00:02:53

+0

很高興幫助:) – 2014-10-11 00:03:07

+0

我忘了提,這篇文章也屬於一個用戶。這是否需要成爲Article&User和Format&User之間的多態關聯? – 2014-10-11 00:08:48

相關問題