有很多通过:如何在连接表中添加记录和填充字段

时间:2016-04-12 10:31:47

标签: ruby-on-rails ruby has-many-through

我有这些模特:

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而没有任何东西。我想避免重新加载或像这样的一些方法。如果可能的话,我想以透明的方式做事

2 个答案:

答案 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