【问题标题】:Rails Model, belongs to manyRails 模型,属于很多
【发布时间】:2011-05-22 15:25:03
【问题描述】:

我很难弄清楚如何将我的一个模型与另一个模型关联起来。

现在,我有:

class ModelA < ActiveRecord::Base
  has_many :model_b
end

class ModelB < ActiveRecord::Base
  belongs_to :model_a
end

但是... ModelB 不仅需要属于 ModelA 的一个实例,还可能属于三个。我知道有一个 has_many :through,但我不确定在这种情况下它会如何工作。 ModelA 的每个实例将始终具有 ModelB 的三个实例。但如前所述,ModelB 可以不只属于 ModelA 的一个实例。

【问题讨论】:

    标签: ruby-on-rails ruby-on-rails-3 associations model-associations


    【解决方案1】:

    rails 中的多对多关系不使用belongs_to。相反,您想使用几个选项之一。第一个是has_and_belongs_to_many

    # app/models/category.rb
    class Category < ActiveRecord::Base
      has_and_belongs_to_many :items
    end
    
    # app/models/item.rb
    class Item < ActiveRecord::Base
      has_and_belongs_to_many :categories
    end
    

    您需要在数据库中添加一个额外的连接表,迁移如下:

    class AddCategoriesItems < ActiveRecord::Migration
      def self.up
        create_table :categories_items, :id => false do |t|
          t.integer :category_id
          t.integer :item_id
        end
      end
    
      def self.down
        drop_table :categories_items
      end
    end
    

    您可以看到连接表的名称是其他两个表名称的组合。这些表必须按上述字母顺序提及,并且:id =&gt; false 需要在那里,因为我们不希望该表上有主键。它会破坏 rails 关联。

    如果您需要存储有关关系本身的信息,还有另一种更复杂的方法,称为has_many :through。我写了一整篇文章,详细介绍了如何使用这两种方法,以及何时使用每种方法:

    Basic many-to-many Associations in Rails

    希望对您有所帮助,如果您有任何其他问题,请与我联系!

    【讨论】:

    • 这真的很有帮助!一个有用的补充是一些关于我们如何在代码中(无论是在控制器中还是在视图中)访问这些关系的示例,谢谢
    【解决方案2】:

    这是@Jaime Bellmyer 使用的

    # app/models/category.rb
    class Category < ActiveRecord::Base
      has_and_belongs_to_many :items
    end
    
    # app/models/item.rb
    class Item < ActiveRecord::Base
      has_and_belongs_to_many :categories
    end
    

    我会推荐使用这个

    # app/models/category.rb
    class Category < ActiveRecord::Base
      has_many :category_items
      has_many :items, :through => :category_items
    end
    
    # app/models/item.rb
    class Item < ActiveRecord::Base
      has_many :category_items
      has_many :categories, :through => :category_items
    end
    
    # app/models/category_items.rb
    class CategoryItems < ActiveRecord::Base
      belongs_to :category
      belongs_to :items
    end
    

    如果您使用它,您将拥有一个连接模型,它可以让您更好地控制处理类别和项目。但是使用@Jaime 的建议,您将只有一个连接表而不是一个模型,这将不受控制。

    【讨论】:

    • 这是否意味着我应该从表中取出外键,因为它们是由连接表链接的?
    • 是的。您不需要将外键存储在父表中,它们可以存储在连接模型中。
    • 为什么仅仅说 Category has_many :items 是不够的(一个 item belongs_to_many categories 但 ActiveRecord 没有这个)
    • 另外,假设您想对用户进行分层,他们可以拥有一个个人项目库。这会是用户 has_many :category_items 和 has_many :items, :through => :category_items 吗?
    • 最后,仅仅说一个用户 has_one :category 代表他们的图书馆作为它自己的类别是聪明还是愚蠢?你想让类别多态吗?
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-09-26
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多