2

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

这是我到目前为止所做的

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", ""] }

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

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

我尝试了很多不同的东西,包括下面的那个

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 }

但它什么也得不到。感谢您能给我的任何帮助!

4

2 回答 2

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> 
于 2013-05-22T20:42:40.297 回答
0

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

将值作为数组返回:

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

将返回哈希,键作为更改的列,值作为真/假为空白:

owner.changes.inject({}){|result,col| result[col.first] = col.last.last.blank?; result}
=> {name: true, surname: false}
于 2013-05-22T20:54:55.537 回答