我有这些模特:
class Item < ActiveRecord::Base
has_many :users, through: :user_items
has_many :user_items
end
class User < ActiveRecord::Base
has_many :items, through: :user_items
has_many :user_items
end
class UserItem < ActiveRecord::Base
belongs_to :user
belongs_to :item
end
create_table "user_items", force: :cascade do |t|
t.integer "user_id",
t.integer "item_id",
t.integer "amount"
end
我想了解向用户添加项目的最佳方法,并在联接表格中设置金额。
我做的是这样的事情:
user = User.first
item = Item.first
UserItems.create(user: user, item: item, amount: 5)
但我不太喜欢它,有时它不能正常工作,因为如果我跑了
user.items #=> []
我得到空数组,好像它没有在数据库中获得新的更改。
那么,有一种简单的方法吗?像这样直观的东西是完美的:
user.user_items << item, amount: 4
好的,所以我这样做了,并且有效:
user.user_items.create!(item: item, amount: 5)
但这样做并没有:
user.user_items << item, amount: 4
现在它更优雅了。但我仍然有关于缓存请求的问题。如果我运行user.items。它仍然是空的。任何的想法?我尝试使用inverse_of而没有任何东西。我想避免重新加载或像这样的一些方法。如果可能的话,我想以透明的方式做事
答案 0 :(得分:1)
您可以这样做:
user = User.first
item = Item.first
user.user_items.create!(item_id: item.id, amount: 5)
或
user.items.push(items)
答案 1 :(得分:0)
试试这个
user.user_items.push(item: item, amount: 5)
或者,如果您想在不推送新值的情况下反映项目,请尝试以下
UserItem.create(user: user, item: item, amount: 5)
user.reload
user.items # this will reflect newly loaded values now