如何有条件地分配给Rails ActiveRecord?

时间:2014-04-02 18:28:08

标签: ruby-on-rails ruby rails-activerecord

嘿,我不太确定该怎么称呼,但这是合同。

我试图只在

中将内容分配给我的数据库值
  1. 数据库中没有值,
  2. 我指定的值不是空白。
  3. 此代码的基本版本是:

    venue.address = venue_json['address'] if venue.address.blank? && !venue_json['address'].blank?
    

    其中venue是我的ActiveRecord结果。

    这就是我现在所拥有的(好一点)。使用Venue.rb类中的init_value

     Venue.init_value(venue.address, venue_json['address'])
    
     def self.init_value(record, value)
       if record.blank? && !value.blank?
         record = value
       end
     end
    

    我想达到这一点,但实在不知道如何。

    venue.address.init_value(venue_json['address'])
    

    特别是因为我喜欢它,它适用于ActiveRecord类的任何属性,而不仅仅是address值。

1 个答案:

答案 0 :(得分:0)

将它分成一个方法听起来是个好主意,但在这种情况下,使用实例方法而不是类方法更有意义。

def init_attribute(attribute, value)
  self.update(attribute => value) if self.send(attribute).blank? && value.present?
end

venue.init_attribute(:address, venue_json['address'])

上面代码段的一些快速评论:

  • 使用直接分配不会持久保存数据库值。您可以选择其他内容,例如updateupdate_column。或者您可以使用分配,然后在对象上调用#save
  • 每当您需要不为空的内容时,您可以使用更易读的Object#present?,它是ActiveSupport的一部分。
  • 您需要使用与数据库对象上的属性相同的名称调用该方法。为此,您将要使用Ruby中的Object#send