【问题标题】:Appending data to JSON column - Rails 4, Postgres将数据附加到 JSON 列 - Rails 4,Postgres
【发布时间】:2017-05-19 11:26:51
【问题描述】:

模型Listing 有一个名为vendorsjson 列,默认为{}

add_column :listings, :vendors, :json, null: false, default: {
  hd: {}
  ...
  }
end

Listing 类中,我尝试将merge!hd: {..} 进行哈希,如下所示:

def self.append_vendor_attrs(sku)
  listing = find_by(sku: sku) || Listing.new(sku: sku)
  listing.vendors[:hd].merge!({ foo: 'bar' })
  listing.vendors_will_change!
  listing.save! # throws no exceptions in the log
end

vendors[:hd] 仍然为空。如果我尝试手动复制它:

l = Listing.create... 
l.vendors[:hd].merge!({ foo:'bar' })

我的哈希值仍然存在。

【问题讨论】:

  • 您是否尝试将listing.vendors_will_change! 移动到您修改属性的行上方?我的直觉是,您方法中的代码告诉 AR 属性的值 的新值,因此当您调用 save! 时它不会认为对象是脏的。
  • @hoffm 当然!在附加数据后,我打电话给will_change,触发AR“监听”对该行的任何更改,但没有任何改变。去布鲁克林!把它变成一个答案,以便我接受?
  • 很高兴它成功了!我刚刚添加了一个答案。

标签: json ruby postgresql ruby-on-rails-4


【解决方案1】:

调用listing.vendors_will_change! 告诉Active Record 该属性的值“是”新值。那么,从 AR 的角度来看,新旧值匹配,因此当您调用 save! 时记录并不脏。

解决方法是将listing.vendors_will_change! 移到您修改属性的行上方。所以新代码将如下所示:

def self.append_vendor_attrs(sku)
  listing = find_by(sku: sku) || Listing.new(sku: sku)
  listing.vendors_will_change!
  listing.vendors[:hd].merge!({ foo: 'bar' })
  listing.save! # throws no exceptions in the log
end

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2017-09-22
    • 2011-03-09
    • 2016-08-14
    • 1970-01-01
    • 2014-04-10
    • 1970-01-01
    • 2013-03-31
    • 1970-01-01
    相关资源
    最近更新 更多