2014-10-10 66 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

相关问题