【问题标题】:Rails Active Record multiple associationsRails Active Record 多重关联
【发布时间】:2014-12-06 04:34:41
【问题描述】:

我有一个使用 Postgres 和 Active Record 的 Rails 应用程序,但无法理解模型之间最有效的关联。

我有一个名为 Article 的模型。文章需要具有格式和 2/3 类型。

我需要文章能够按格式列出,即http://myapp.com/format/format-id/article-id

我还需要按类型列出文章,所以:myapp.com/genre/genre-name/article-id

我在想 Genres 和 Formats 本身就是与文章关联的 has_many_and_belongs_to 模型。每篇文章有多个流派和一种格式,但每个流派有多个文章。

我知道这应该很简单,但我找不到实现这一目标的最有效途径。

【问题讨论】:

    标签: ruby-on-rails postgresql activerecord associations


    【解决方案1】:

    有一个旧的 Railscasts 插曲介绍了与 Rails 进行多对多关联的两种方式 - 你应该观看它:http://railscasts.com/episodes/47-two-many-to-many。它已经很老了,但大部分仍然相关。

    所以,您有文章、格式和流派。由于每篇文章只有一种格式,因此您不需要has_and_belongs_to_many 关系。文章belongs_to格式,和has_many文章格式。

    articles 表中的每一行都有一个format_id 字段来指示它属于哪个格式。

    Genres 和 Articles 之间的关系是多对多的,这有点棘手。在数据库级别,这需要一个“连接表”。您的连接表将被称为articles_genres,每一行代表一篇特定文章所具有的一种类型。所以,它会有一个genre_id 列和一个article_id 列。

    就rails而言,有两种方法可以做到这一点:

    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
    

    【讨论】:

    • 非常感谢,这正是我想要的!我想我会选择第一条路线,以减轻 Rails 的负担。再次感谢!
    • 我忘了说,文章也属于一个用户。这需要是文章和用户与格式和用户之间的多态关联吗?
    • 不。如果一篇文章也属于某个用户,那么您只需:belongs_to :user 在您的 Article 模型中,has_many: Article 在您的 User 模型中。格式根本不需要参与该关联。
    • 单个模型可以有多个“belongs_to”关联,没有问题。
    • 知道了,谢谢!最后一个问题-我现在以什么格式/如何将流派应用于文章?它会是一个流派字符串数组吗?还是 Genre_id 的数组?我了解关系/架构,但看不到现在如何将流派分配给文章。
    猜你喜欢
    • 1970-01-01
    • 2017-10-14
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-12-25
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多