我有一个地址拆分为@profile.street_address
,@profile.region
,@profile.zip_code
。如何从轨道模型中的其他字段生成字段
我想创建
@profile.address = "#{@profile.street_address} #{@profile.region} #{@profile.zip_code}"
是什么做的,这是创建或更新我的模型每一次的最佳方法?
我有一个地址拆分为@profile.street_address
,@profile.region
,@profile.zip_code
。如何从轨道模型中的其他字段生成字段
我想创建
@profile.address = "#{@profile.street_address} #{@profile.region} #{@profile.zip_code}"
是什么做的,这是创建或更新我的模型每一次的最佳方法?
你会使用before_save
所有的属性到你想要的结合是最好的(虽然IMO这是不好的做法):
#app/models/profile.rb
class Profile < ActiveRecord::Base
before_save :set_address
private
def set_address
self.address = "#{street_address} #{region} #{zip_code}"
end
end
重要的是考虑一下Rails中的DRY
(不要重复自己)原则的作用,这意味着你应该只做一次,根据需要重复使用它。这是您的数据
为此的情况下非常中肯,我会强烈建议创建自定义getter
为您address
你的模型:
#app/models/profile.rb
class Profile < ActiveRecord::Base
def address
"#{street_address} #{region} #{zip_code}"
end
end
这不是address
数据保存到数据库,但会使您能够在控制器&的视图中加载@profile.address
。为什么这很重要?简单地说,因为当你调用address
,它会直接从其他属性在你的数据库拉动,而不是复制的属性,你将不得不否则
我个人推荐这种方法,但无论是将实现你想要
什么您可以设置before_save
回调。
before_save do
self.address = "#{street_address} #{region} #{zip_code}"
end
在您的地址类:
before_save :set_address
def set_address
self.address = "#{profile.street_address} #{profile.region} #{profile.zip_code}"
end
这是假设的个人资料在你的型号。
这可能是更好的通过只是使它成为一个实例方法,像这样的正常化您的数据库:
def address
"#{profile.street_address} #{profile.region} #{profile.zip_code}"
end