我有一個地址拆分爲@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