我的地址分为@profile.street_address
,@profile.region
,@profile.zip_code
。
我想创建
@profile.address = "#{@profile.street_address} #{@profile.region} #{@profile.zip_code}"
每次创建或更新模型时,最好的方法是什么?
答案 0 :(得分:2)
你最好使用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
(不要重复自己)原则的作用,这意味着你应该只做一次,根据需要经常重复使用。这与您的数据非常相关
为此,我强烈建议您为模型中的address
创建自定义getter
:
#app/models/profile.rb
class Profile < ActiveRecord::Base
def address
"#{street_address} #{region} #{zip_code}"
end
end
这不会将address
数据保存到您的数据库,但可以让您在控制器中加载@profile.address
&amp;观点。为什么这很重要?简单地说,因为当你调用address
时,它将直接从你的数据库中的其他属性中提取,而不是你曾经拥有的重复属性
我个人会推荐这种方法,但要么达到你想要的效果
答案 1 :(得分:0)
您可以设置before_save
回调。
before_save do
self.address = "#{street_address} #{region} #{zip_code}"
end
答案 2 :(得分:0)
在您的地址类中:
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