Simple Rails数组不保存到数组列

时间:2014-08-18 15:39:13

标签: ruby-on-rails ruby postgresql hstore

我正在使用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_hashes列
  2. 中初始化为空数组
  3. 我将添加的产品存储为哈希值,因为有几种方法可以将产品添加到购物车,并且每种方法都需要自己的逻辑来删除和自定义。
  4. 每个用户都有自己的购物车,需要稍后引用,这就是为什么购物车会像这样保存到数据库中(而不是使用会话变量)。
  5. 任何想法我做错了什么?我没有看到错误:服务器日志记录cart.added_product_hashes列正确更新,但更改不会持续存在。

    正如詹姆斯指出的那样,<<并没有将记录标记为脏,因为它就地编辑了数组。虽然我没有在数组列中更改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
    

    詹姆斯还提出了一种更简洁的特定方法。

1 个答案:

答案 0 :(得分:4)

请参阅&#34; New data not persisting to Rails array column on Postgres&#34;

当正在更新属性时,ActiveRecord无法识别对阵列的更改。

您也可以这样做:

cart.added_product_hashes_will_change!