我在Rails中使用ActiveRecord进行了多对多的关联设置。假设表格是
+------------+ +----------------+ +----------+
| categories | -- has many -= | category_items | =- has many -- | products |
+------------+ +----------------+ +----------+
在category_items表中,我有标准的id集和一个名为“type”的额外属性:
id:int
category_id:int
product_id:int
category_type:string
值得庆幸的是,Rails提供了一些很好的帮助,可以轻松地在映射表中进行赋值。例如:
p = Product.first # p.id => 1
c = Category.first # c.id => 1
# now to make the assignment
p.categories << c
# or
p.categories.create(c)
这一切都很好,但是我想说我想用另一个表的类名自动更新“type”字段。因此,对于上面给出的示例,我的category_items行将如下所示:
id = 1 (or some number)
category_id = 1
product_id = 1
category_type = nil
但我希望category_type等于“Product”。有没有办法让我在关联中构建一个回调或定义一些会自动设置category_type字段的东西?我知道在多态关联中,你可以使用类似:source或:as做类似的事情,但是多对多关联中的多态关联会引发错误。
有什么想法吗?
谢谢!
答案 0 :(得分:1)
你是否尝试过像这样的category_items多态:
class CategoryItem < ActiveRecord::Base
belongs_to :category, :polymorphic => true
belongs_to :product
end
class ACategory < ActiveRecord::Base
has_many :category_items, :as => :category
end
class AnotherCategory < ActiveRecord::Base
has_many :category_items, :as => :category
end
class Product < ActiveRecord::Base
has_many :category_items
end
我认为这样做会有所作为!
答案 1 :(得分:0)
我最终制作了单独的getter / setter方法。在您的情况下,产品上的方法:
设定器
def set_category_type(category_id, type)
category_items = self.category_items.select { |category_item| category_item.category_id == category_id}
if category_items.length > 0
category_item = category_items.first
category_item.type = type
category_item.save
else
CategoryItem.create(:product_id => self.id, :category_id => category_id, :type => type)
end
end
吸气剂
def category_type(category_id)
category_item = self.category_items.where(:category_id => category_id ).first()
if category_item.nil?
nil # or some other default type value
else
category_item.type
end
end
这基本上是我所需要的,却找不到更优雅的方式。如果你知道的话,请告诉我一个更好的方法。