【问题标题】:Simple Rails array not saving to array column简单的 Rails 数组不保存到数组列
【发布时间】:2014-10-11 14:07:55
【问题描述】:

我正在使用 Rails 4.1.0、Ruby 2.1.0 和 Postgres 9.3.0.0。

我正在尝试将更改保存到一个 hstore 数组(Ruby 用语中的哈希数组)的列。

这是产品模型中的(简化的)代码,用于保存更改:

def add_to_cart_with_credits(cart)
    cart.added_product_hashes << {"id" => self.id.to_s, "method" => "credits"}
    # For some reason, this isn't saving (without the exclamation, as well)
    cart.save!
end

注意几点:

  1. 使用 added_product_hashes 列中的空数组初始化购物车
  2. 我将添加的产品存储为哈希值,因为有多种方法可以将产品添加到购物车中,并且每种方法都需要自己的逻辑来删除和自定义。
  3. 每个用户都有自己的购物车,以后需要引用它,这就是购物车被这样保存到数据库的原因(我猜不是使用会话变量)。

任何想法我做错了什么?我没有看到错误:服务器日志注意到 cart.added_product_hashes 列更新正确,但更改不会持续。

解决方案

正如 James 所指出的,&lt;&lt; 不会将记录标记为脏记录,因为它会就地编辑数组。虽然我没有在数组列中更改 hstore 本身,但似乎除非显式重建该属性,否则不会拾取对封闭数组的更改。下面的代码解决了这个问题:

def add_to_cart_with_credits(cart)
    cart.added_product_hashes = cart.added_product_hashes + [{"id" => self.id.to_s, "method" => "credits"}]
    # Now we're all good to go!
    cart.save!
end

James 还提出了一种更简洁的特定方法。

【问题讨论】:

  • 您是否尝试过使用新的 JSON 列类型? Rails 似乎可以更好地处理该数据的序列化。
  • 我不想直接切换到另一种列类型,因为我最近才搬到 hstores!不过感谢您的提示:我现在就去看看。
  • 这应该是一个非常简单的迁移,并且会开辟其他存储数据的方式。我一直觉得 HSTORE 使用起来非常麻烦。 Postgres 9.3 中的新 GIN 索引选项和 9.4 中的操纵器使 JSON 列类型非常有效。另外,Rails 4 从本质上理解它们。

标签: ruby-on-rails ruby postgresql hstore


【解决方案1】:

见“New data not persisting to Rails array column on Postgres

ActiveRecord 无法识别对数组的更改,因为属性正在就地更新。

你也可以这样做:

cart.added_product_hashes_will_change!

【讨论】:

  • 是的,恰到好处。我最终直接设置了 added_product_hashes 属性,而不是使用
猜你喜欢
  • 2018-10-04
  • 2013-06-21
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多