我有两个数据库表,分别是域和类别。
域名可以包含多个类别,类别可以包含多个域名。
使用has_and_belongs_to_many设置两个模型。
逻辑上,当一个类别与一个域相关联时,一个域与一个类别相关联。然而...
irb(main):062:0> domain.categories.any?
=> false
irb(main):063:0> category.domains.any?
=> true
我错过了什么?
答案 0 :(得分:2)
<强> HABTM 强>
对于后代,您需要进行以下设置:
#app/models/domain.rb
class Domain < ActiveRecord::Base
has_and_belongs_to_many :categories
end
#app/models/category.rb
class Category < ActiveRecord::Base
has_and_belongs_to_many :domains
end
#table - categories_domains - category_id | domain_id
这为您提供了在相应对象上调用domain.categories
或category.domains
方法所需的相关关联。
<强>协会强>
为了向您强调这个想法(因为您是新手),让我详细说明ActiveRecord associations
在Rails中的重要性。
Rails是MVC framework,是object orientated。如果你开始这并不意味着什么,但随着你的进步,这将变得非常重要。
Rails的面向对象特性意味着每次要添加一项功能时,您确实需要使用围绕对象。根据MVC convention,您的对象是在Model
内构建的(这就是为什么您可以调用Model.new
等)
当您关联对象(模型)时,您基本上告诉Rails(通过ActiveRecord),这两个对象是关联的。 AR就是所谓的ORM - object relationship mapper - 这意味着它提供abstraction layer以便您更轻松地调用关联数据:
-
这意味着如果要将两个对象(模型)关联在一起,您基本上需要在各自的模型中定义两个关联,然后在应用程序的其他部分提供功能