我有两个模型:
class Product
belongs_to :storage_box
end
class StorageBox
validates :key
presence: true,
uniqueness: { scope: %i[kind] }
validates :kind
presence: true
def code
"#{key}#{kind.to_s.rjust(4, '0')}"
end
end
我希望能够storage_box
根据该code
方法设置关系:
Product.new(storage_box: '150001')
我该如何实现这一目标?我不确定是否Product
应该处理这个问题(似乎没有“轨道”可以做到这一点)或指导StorageBox
如何在 上找到基础code
。
有很多方法可以进行编码
Product.new(storage_box: '150001')
。例如,您可以覆盖该storage_box=
方法以检测字符串输入并生成新StorageBox
实例来替换该字符串。但我强烈建议您不要这样做!这种方法的问题在于,你让标准 ActiveRecord 方法以非设计的方式工作。根据我的经验,这总是会在以后导致意想不到的后果。此外,它还会让下一个接触你代码的开发人员感到困惑。
相反,我建议你编写一个专用的类方法:
你的通话将变成
Product.new_in_storage_box('15001')
更好的是,我建议你将存储箱代码的细分移至存储箱类。所以:
这样,您的意图就很明确,并且新代码不会干扰
Product.new
方法的正常运行。