2014-09-05 51 views
0

我有一个地址拆分为@profile.street_address@profile.region,@profile.zip_code如何从轨道模型中的其他字段生成字段

我想创建

@profile.address = "#{@profile.street_address} #{@profile.region} #{@profile.zip_code}" 

是什么做的,这是创建或更新我的模型每一次的最佳方法?

回答

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 

DRY

重要的是考虑一下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,它会直接从其他属性在你的数据库拉动,而不是复制的属性,你将不得不否则

我个人推荐这种方法,但无论是将实现你想要

什么
0

您可以设置before_save回调。

before_save do 
    self.address = "#{street_address} #{region} #{zip_code}" 
end 
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 
相关问题