如何从rails模型中的其他字段生成字段

时间:2014-09-05 02:10:22

标签: ruby-on-rails

我的地址分为@profile.street_address@profile.region@profile.zip_code

我想创建

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

每次创建或更新模型时,最好的方法是什么?

3 个答案:

答案 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

DRY

需要考虑的重要事项是在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