Rails和脏对象:访问已更改字段的值

时间:2013-05-22 20:36:40

标签: ruby-on-rails

在我的应用程序中,我设置了一个Event系统来显示用户发生的所有事情的日志。它使用脏对象。

这是我到目前为止所做的事情

def log_details_change(owner)
  Event.log(owner.condo, :updated_owner_details, [owner.changes.slice('first_name', 'last_name', 'email', 'start_date', 'phone_number')])
end

现在我知道owner.changes方法提供了一个类似于

的哈希
{ 'title' => ["Title", "New Title"] }

例如,如果我删除了用户的电话号码,则owner.changes返回的哈希变为

{ 'phone_number' => ["514554541", ""] }

基本上,更改后的值为空(或空白,或者为空 - 我真的不知道)。

如何访问这些值以检查更改后的值是否为空?我想显示一个字符串而不是''字符串。

我尝试过很多不同的事情,包括下面的事情

owner.changes.slice('first_name', 'last_name', 'email', 'start_date', 'phone_number').each_value { |v,k| v.blank? or v.nil? or v.empty? ? 'nope' : v }

但它什么也没给我。 谢谢你能给我的任何帮助!

2 个答案:

答案 0 :(得分:2)

您可以尝试以下方法吗?

owner.changes.map{ |attr, changes| changes[1].blank? ? owner[attribute] = 'nope' : nil }

版本较长:

owner.changes.map do |attribute, changes|
  changes.map do |old_val, new_val| 
    owner[attribute] = 'was empty' if new_val.blank?
  end
end

在我的Intervention模型(属性:name)上测试:

irb(main):083:0> i = Intervention.first
irb(main):084:0> i.name
=> "création FAV poignet gauche"
irb(main):085:0> i.name = ''
irb(main):086:0> i.changes.map{ |attr, changes| changes.last.blank? ? i[attr] = 'nope' : nil }
=> ["nope"]
irb(main):087:0> i.changes
=> {"name"=>["création FAV poignet gauche", "nope"]}
irb(main):088:0> 

答案 1 :(得分:0)

有很多方法可以做到这一点,有一些很脏:

将值作为数组返回:

owner.changes.map{|column_name,column_change| column_change.last.blank? }
=> [true, false]

将使用key作为已更改的列返回哈希值,并将值返回为true / false表示空白:

owner.changes.inject({}){|result,col| result[col.first] = col.last.last.blank?; result}
=> {name: true, surname: false}