在我的应用程序中,我设置了一个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 }
但它什么也没给我。 谢谢你能给我的任何帮助!
答案 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}