简单的Rails数组不保存到数组列



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

我试图将更改保存到一个列,这是一个数组的hstores(在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_hash列中的空数组初始化的
  2. 我将添加的产品存储为哈希,因为有几种方法可以将产品添加到购物车中,并且它们每个都需要自己的逻辑来删除和定制。
  3. 每个用户都有自己的购物车,以后需要引用它,这就是为什么购物车像这样保存到DB(而不是使用会话变量,我猜)。

你知道我做错了什么吗?我没有看到错误:服务器日志注意到cart.added_product_hashes列更新正确,但更改不持久。

<<p> 解决方案/strong>

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

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还提出了一种更简洁的方法。

参见"新数据不保存到Postgres上的Rails数组列"

ActiveRecord不能识别数组的变化,因为属性正在被更新。

你也可以这样做:

cart.added_product_hashes_will_change!

最新更新