【问题标题】:Ruby on rails - ActiveRecord query from array valuesRuby on rails - 来自数组值的 ActiveRecord 查询
【发布时间】:2016-05-17 17:52:51
【问题描述】:

我正在构建一个日志记录方法。

在我的更新操作中,我将 post 值中的参数与实际 db 的值进行比较,以捕获更改并将它们放入数组中

1° step - 创建一个数组并使用更改名称填充 修改 = Array.new

modificati.push("nome") if @clienti.nome != params[:clienti][:nome]
modificati.push('email') if @clienti.email != params[:clienti][:email]
..... the same for every field .....

2°步是只记录更改的字段,所以我创建了一个带有更改的新数组

modifiche = Array.new

modificati.each do |m|
    modifiche.push( "#{m} : #{@clienti.m} >>  - ")
end     

但它不起作用,有人可以帮助我吗? 我的目标是把它放在数组中:

“名称:old_value_from_db >> new_value_from_post”

但错误是:

# 的未定义方法“m”

谢谢大家

【问题讨论】:

    标签: ruby-on-rails arrays activerecord


    【解决方案1】:

    你需要从@client调用属性(或方法),比如:

    modificati.each do |m|
      modifiche.push( "#{m} : #{@client.public_send(m.to_sym)} >>  - ")
    end  
    

    编辑:如果@client 是一个活动记录对象,您可以在保存之前使用@client.changes 来跟踪对对象属性所做的任何更改。

    编辑:填充第二个值,你可以在改变它之前复制@client:

    client_before = @clienti.dup
    .
    .
    .
    # update @clienti, then
    .
    .
    modifiche = []
    modificati.each do |m|
      modifiche.push( "#{m} : #{client_before.public_send(m.to_sym)} >>  #{@clienti.public_send(m.to_sym)} ")
    end  
    

    【讨论】:

    • send 绝对不推荐。最好使用public_send
    • 第二个属性你能帮我吗? modifiche.push("#{m} : #{@clienti.public_send(m.to_sym)} >> - #{params[:clienti][public_send(m.to_sym)]} ")
    • 答案已添加到帖子中。希望对您有所帮助
    • 感谢 jhon,但这不是我的目标.....第二个值必须类似于“params[:clienti][:nome]”并且“nome”来自数组 --> 'm ' 就像在第一个属性中
    • 当然,您可以将发送值更改为参数,这也是有效的。我假设您正在做类似 @clienti.update_attributes(params[:client]) 的事情,这就是为什么我建议在使用参数值更改对象之前复制对象
    猜你喜欢
    • 2012-11-20
    • 1970-01-01
    • 1970-01-01
    • 2012-05-10
    • 1970-01-01
    • 1970-01-01
    • 2014-05-22
    • 2011-01-21
    • 1970-01-01
    相关资源
    最近更新 更多