Has_Many_Through 无法将多推到通过

Has_Many_Through Failing To Push a Many to a Through

我正在尝试建立一个 has_many_through 关系,在该关系中,用户可以拥有带有商品的购物车。我可以向用户添加购物车 (chip.carts << chips_cart),但我无法将商品放入我的购物车 (chips_cart << coffee)。

我得到 NoMethodError: undefined method <<' for #`

class User < ActiveRecord::Base
    has_many :carts
    has_many :items, through: :carts
end
class Cart < ActiveRecord::Base
    belongs_to :user
    has_many :items
end
class Item < ActiveRecord::Base
    belongs_to :carts
    has_many :users, through: :carts
end

chip = User.create(username: "Chip")
chips_cart = Cart.create
socks = Item.create(item: "socks", price: 5.00)
class Item < ActiveRecord::Base
  belongs_to :cart
  ...
end

正如 Hubert 所指出的,您有一个复数错误:

belongs_to :cart # not :carts

belongs_to/has_one 个协会的名称应始终为单数。

而且你一开始就不需要使用铲子操作员<<:

chip = User.create(username: "Chip")
chips_cart = chip.carts.create
socks = chips_cart.items.create(item: "socks", price: 5.00)

个别记录不响应 <<。这就是为什么你得到 NoMethodError: undefined method <<' for #<Cart id: 5, user_id: nil>。如果你想使用 shovel operator 你需要做 chips_cart.items << socks 而不是 chips_cart << socks.

哦,甜蜜的语法糖

如果你真的想做到 chips_cart << socks 你可以实现 << 方法:

class Cart < ApplicationRecord
  # ...
  def <<(item)
     items << item
  end
end

那是因为像 Ruby 中的许多运算符一样,shovel 运算符实际上只是方法调用的语法糖。