belongs_to has_many关联帮助

时间:2010-09-06 16:20:05

标签: ruby-on-rails

我为模型类别和产品(都是使用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方法或关联有问题吗?

2 个答案:

答案 0 :(得分:1)

首先,您不需要明确的category_idcategory_id=方法。 ActiveRecord会为您处理belongs_to关联。

其次,您是否需要has_and_belongs_to_manyhas_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关系。