我有以下型号:带有送货地址和账单地址的订单。在初始化每个地址时,我想自动设置一个类型字段来确定种类(船或帐单)。
class Order < ApplicationRecord
belongs_to :ship_address, class_name: 'Address'
belongs_to :bill_address, class_name: 'Address'
end
class Address < ApplicationRecord
after_initialize do |address|
#how do i know if it's a :ship_address or :bill_address?
self.kind = "ship"
end
end
我想自动设置一个类型字段,以便得到以下信息:
address = Order.create_ship_address!(params)
address.kind #=> "ship"
我已经检查了Reflections,但是看起来对Class来说效果很好,但是对于实例来说却不是。
答案 0 :(得分:0)
在创建地址之前简单地将kind = 'ship'
合并到您的参数中
params.merge(kind: "ship")
然后打电话
address = Order.create_ship_address!(params)
现在您将得到
address.kind #=> 'ship'
答案 1 :(得分:0)
因此,我最终通过使用Rails ActiveRecord内部语法来解决此问题,这使其变得非常快捷,便捷:
class Order < ApplicationRecord
belongs_to :ship_address, -> { where(kind: :ship) }, class_name: 'Address'
belongs_to :bill_address, -> { where(kind: :bill) }, class_name: 'Address'
end
我决定在我的地址模型中添加一个字段kind
,并且使用了Enum
这样的功能:
class Address < ApplicationRecord
enum kind: [:ship, :bill]
end
总体而言,将ActiveRecord关联与作用域一起使用可以解决我的问题。它使使用起来非常方便,因为当您实例化新地址时,kind
属性已经设置好,可以有效地解决我的问题。
@bill_address = Order.last.build_bill_address
@bill_address.kind #=> 'bill'