ruby-on-rails - Simple Rails 数组未保存到数组列

标签 ruby-on-rails ruby postgresql hstore

我正在使用 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. 每个用户都有自己的购物车,并且需要稍后引用它,这就是为什么购物车像这样保存到数据库中(我猜不是使用 session 变量)。

你知道我做错了什么吗?我没有看到错误:服务器日志注意到 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

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

最佳答案

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

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

你也可以这样做:

cart.added_product_hashes_will_change!

关于ruby-on-rails - Simple Rails 数组未保存到数组列,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/25367072/

相关文章:

ruby-on-rails - CSRF token 与 session 中的 token 不匹配(Rails 4.1)

ruby - 将字符串转换为正则表达式 ruby

node.js - 如何将数据库连接到 Angular Web 应用程序?

sql - 逃跑? (问号)在 hibernate/gorm sql 限制

ruby-on-rails - 如何将数据从关联表的列迁移到 hstore 列?

ruby-on-rails - 使用正则表达式忽略隐藏文件

ruby-on-rails - 使用 Pow 的欢迎使用 Rails 屏幕上的 SyntaxError

ruby - Net::ReadTimeout (Net::ReadTimeout) Selenium ruby

ruby-on-rails - 为什么这样的代码有效?

php - 将 MySQL 日期转换为 PostgreSQL 日期