我需要添加有关HABTM关系的元数据。我想使用has_many:through关系来完成此任务,但这不是必需的。这是简化的问题:
class Customer < ActiveRecord::Base
has_many :customer_teddy_bears
has_many :teddy_bears, :through => :customer_teddy_bears
end
class CustomerTeddyBear < ActiveRecrod::Base
belongs_to :customer
belongs_to :teddy_bear
attr_accesible :most_favoritest # just to show it exists, boolean
end
class TeddyBear < ActiveRecord::Base
has_many :cusomter_teddy_bears
end
所以我需要做的就是开始向我的顾客添加泰迪熊,Teddy Bears是一组固定的数据,比方说fireman_bear,doctor_bear,dominatrix_bear。任何顾客都可以声称拥有一种泰迪熊,但他们也指明哪只是他们最喜欢的熊。由于我无法修改Bear模型,因为它在所有客户之间全局共享,我将元数据(以及其他元数据)添加到CustomerTeddyBear。
问题是以下情况不起作用。
customer = Customer.new # new record, not yet saved, this must be handled.
customer.teddy_bears << fireman_bear
customer.teddy_bears << doctor_bear
# now to set some metadata
favoritest_record = customer.customer_teddy_bears.select{|ctb| ctb.teddy_bear == doctor_bear}.first
favoritest_record.most_favoritest = true
上述代码不起作用,因为customer_teddy_bears条目仅在保存期间在数据库中创建记录时填充。还有另一种机制吗?
如果内置轨道中没有“自动”内容,我只需要在选择teddy_bears
并使用
customer_teddy_bears
来手动管理此关系
def teddy_bears
self.customer_teddy_bears.map(&:teddy_bear)
end
以及手动创建关联,而不是使用:through关系。
请注意,所有这些必须在#save
对象上执行Customer
之前发生,因此我需要在内存中设置所有相关元数据。
我从#RubyOnRails获得的建议
ctb = customer.customer_teddy_bears.build({:customer => customer, :teddy_bear => fireman_bear})
ctb2 = customer.customer_teddy_bears.build({:customer => customer, :teddy_bear => doctor_bear})
...
ctb.most_favoritest = true
答案 0 :(得分:1)
你可以这样做:
customer = Customer.new # new record, not yet saved, this must be handled.
customer.teddy_bears << fireman_bear
customer.teddy_bears << doctor_bear
customer.save
fav = CustomerTeddyBear.where(:customer_id => customer.id, :teddybear_id => doctor_bear.id)
fav.most_favoritest = true
fav.save
答案 1 :(得分:0)
我不得不求助的解决方案是手动构建CustomerTeddyBear
对象并同时设置customer,teddy_bear和most_favoritest。基本上大部分时间,customer.customer_teddy_bears.map(&:teddy_bear)
至少在逻辑中进行访问,其中可能是记录尚未保存,否则只是快捷到customer.teddy_bears
。