我有一个模型,其中有一个用户名字符串和一个感兴趣的字符串数组。我想做的是允许用户在点击按钮时添加兴趣,方法是将他们感兴趣的内容添加到当前数组中。但是,当我update
时,它不会更新模型中的数组字段。那是为什么?
例如,如果您在rails控制台...
@existing = User.find(1)
ints = @existing.interests
ints.append("a new interest")
@existing.update(interests: ints)
这不会更新记录,我无法弄清楚为什么......我在我的数据库中看到它显示Begin,Commit,True但是当我User.find(1)
时它只显示没有新兴趣的数组加入。
这是架构:
create_table "users", force: true do |t|
t.string "email"
t.string "interests", default: [], array: true
t.datetime "created_at"
t.datetime "updated_at"
end
这是迁移
class CreateUsers < ActiveRecord::Migration
def change
create_table :users do |t|
t.string :email
t.string :interests, array: true, default: '{}'
t.timestamps
end
end
end
使用rails 4+和ruby 2+以及PSQL
答案 0 :(得分:0)
更新失败的原因是因为ActiveModel::Relation#update
使用不当。它期望您要更新的模型的ID,然后是属性的哈希。您想使用Model#update_attributes
或Model#update_attribute
:
@existing.update_attributes(interests: ints) # Takes a hash of attributes
# or
@existing.update_attribute(:interests, ints) # takes the name of the column, and the new value
使用Arrays需要注意的事项:ActiveRecord脏跟踪不跟踪更新,只有setter跟踪脏状态。
有两种方法可以解决这个问题:
<attribute>_will_change!
会将该属性标记为脏model.attribute += [new_object]
附加到作业中,标记为脏“