2014-09-05 49 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 
相關問題