【问题标题】:Question on Proper Associations in Rails关于 Rails 中正确关联的问题
【发布时间】:2011-10-21 15:40:48
【问题描述】:

以这种情况为例。

您有 3 个模型:

  1. 诗人 - 代表一首诗的作者
  2. Poem - 代表诗人写的一首诗
  3. 印刷 - 代表任何类型的包含诗人诗歌的印刷出版物。

诗人和诗歌一目了然:

  • 诗人has_many诗篇
  • belongs_to诗人

在处理打印模型时,我感到很困惑。

在这种情况下,印刷,在某种意义上,属于诗人和诗歌。你可以说一个诗人 has_many printings 或一首诗 has_many printings 是有道理的,但走相反的路线很棘手......

如果某杂志或书籍印刷了一位诗人的 5 首诗,情况会怎样?或者,其中一首诗发表在 10 种不同的杂志上?

印刷本身似乎“属于许多”诗歌或诗人。我知道这是错误的,但我只是想阐明这一点。

所以可以回答的问题是: 你将如何建立这些关系?具体来说,模型和数据库表会是什么样子?您将如何使用它们来访问相关数据?

谢谢!

【问题讨论】:

    标签: ruby-on-rails activerecord associations has-many has-many-through


    【解决方案1】:

    如果某杂志或书籍印刷了一位诗人的 5 首诗,情况会怎样?

    请记住,如果您的诗人有很多诗,而印刷品也有很多诗,那么您总能找到这位诗人。

    Poet.poems.first.printings 将返回诗人第一首诗的所有印刷品

    或者你可以做 Printing.poems.first.poet 这样你就可以得到印刷中第一首诗的诗人。

    您将如何建立这些关系?具体来说,模型和数据库表会是什么样子?您将如何使用它们来访问相关数据?

    我会这样设置

    Poet :has_many poems
    poem :belongs_to poet
    poem :has_and_belongs_to_many printings
    printing :has_many poems
    

    因为您使用的是 has_and_belogs_to_many 关联,所以您需要一个连接表,用于诗歌和印刷

    你会有像这样的迁移

    CreatePoemsPrintingJoinTable < ActiveRecord::Migration
      def self.up
        create_table :poems_printings, :id => false do |t|
          t.integer :poem_id
          t.integer :printing_id
        end
      end
    
      def self.down
        drop_table :poems_printings
      end
    end
    

    其他表很简单

    CreateTablePoems < ActiveRecord::Migration
      def self.up
        create_table :poems, do |t|
        t.integer :poet_id
        end
      end
    
      def self.down
        drop_table :poems
      end
    end
    
    CreateTablePoets < ActiveRecord::Migration
      def self.up
        create_table :poets do |t|
        end
      end
    
      def self.down
        drop_table :poems
      end
    end
    
    CreateTablePrintings < ActiveRecord::Migration
      def self.up
        create_table :printings do |t|
        end
      end
    
      def self.down
        drop_table :printings
      end
    end
    

    【讨论】:

    • 如果一首诗可以出现在许多印刷品中,那就更棘手了,不确定这里是否是这种情况?
    • 就是这样,我刚刚在你们发布答案时更新了文本:X
    • 我建议在这种情况下写一首诗has_and_belongs_to_many :printings
    • 我同意,我总是忘记 habtm,我更新了我的答案以反映它
    • 您愿意为您的解决方案添加数据库表的外观吗?我假设这很简单,但只是想确定一下。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多