我为模型类别和产品(都是使用scaffold创建)创建了一个连接表。产品型号是这样的:
class Product < ActiveRecord::Base
belongs_to :category
def category_id
category.id if category
end
def category_id=(id)
self.category = Category.find_by_id(id) unless id.blank?
end
end
,类别模型是这样的:
class Category < ActiveRecord::Base
has_and_belongs_to_many :products
end
在form.html.erb中,我创建了一个包含用户可供选择的所有类的保管箱:
<p>
<label for="product_category_id">Category:</label><br />
<%= f.collection_select :category_id, Category.find(:all), :id, :name, :prompt => "Select a Category" %>
</p>
然而,当我看一下产品展示时:
<p>
<b>Category:</b>
<%= @product.category_id %>
</p>
或产品列表(index.html.erb):
<td><%= product.category_id %></td>
没有类别。只是空白。我不明白。 category_id方法或关联有问题吗?
答案 0 :(得分:1)
首先,您不需要明确的category_id
和category_id=
方法。 ActiveRecord
会为您处理belongs_to
关联。
其次,您是否需要has_and_belongs_to_many
或has_many
/ belongs_to
关联似乎不匹配。如果你有一个连接表,那么你有前者,在这种情况下,关联的两边都应该用has_and_belongs_to_many
声明。如果您只是在产品表上使用category_id
,那么您在类别上的关联的另一端应为has_many :products
。
使用连接模型:
class Categorization < ActiveRecord::Base
belongs_to :category
belongs_to :product
end
您将在Product
课程中定义:
has_many :categorizations
has_many :categories, :through => :categorizations
然后,因为您的关联是“多个”关联,所以您不会在产品上获得.category
方法。但是,您可以获得categories
方法(以及其他几种方法 - 请查看has_many文档)。如果您为collection_select
category_ids
命名,那么它应该按预期工作。您可能还想在选择中添加“多个”选项,以便选择多个类别。
答案 1 :(得分:0)
您的关联显然不正确。正如所指出的,该类别有很多产品。如果你想使用多对多关系,强烈建议你使用has_many:through关系。