has_many:通过 - 匹配现有产品类别,否则创建新产品类别

时间:2013-03-17 15:01:51

标签: ruby-on-rails

product.rb

class Product < ActiveRecord::Base
  attr_accessible :description, :name

  has_many :categorizations
  has_many :categories, :through => :categorizations

  validates :name, uniqueness: true
end

category.rb

class Category < ActiveRecord::Base
  attr_accessible :name

  has_many :categorizations
  has_many :products, :through => :categorizations

  validates :name, uniqueness: true
end

categorization.rb

class Categorization < ActiveRecord::Base
  attr_accessible :category_id, :product_id  # Should I leave these accessible?

  belongs_to :product
  belongs_to :category
end

这就是我在终端尝试的内容:

> p1 = Product.create(name: "Product A", description: "Product A description")
> p1.categories
> []
> Category.all
> []
> p1.categories.create(:name => "Cat A")
> p1.categories.find(1).name
> ["Cat A"]
>
> p2 = Product.create(name: "Product B", description: "Product B description")
> p2.categories
> []
> p2.categories.update_attributes(:name => "Cat A")

我得到'update_attributes'的未定义方法错误。

  1. 如何在不在数据库中创建重复类别的情况下将产品分配到类别? (即由于上面已经创建了“Cat A”,如何指定“p2”具有相同的类别,同时在数据库中只保留一个“Cat A”记录?)
  2. 当我想搜索特定产品的类别时,当我输入“p.categories.name”时,我会返回模型“类别”的名称。如何在数组中返回类别名称?
  3. 在网络表单中实现此功能的最佳方式是什么?

2 个答案:

答案 0 :(得分:0)

我希望您的类别名称属性是唯一的。

@categoryCatA = Category.find_by_name("Cat A")

p1.categories << @categoryCatA

p2.categories << @categoryCatA

要获取分配给某个产品的所有类别的名称,这将返回一个数组:

p1.categories.map {|category| category.name}

答案 1 :(得分:0)

对于任何好奇的人,我在一篇写得很好的文章中找到了答案:

http://tutorials.jumpstartlab.com/projects/blogger.html#i3:-tagging