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 运算符实际上只是方法调用的语法糖。
我正在尝试建立一个 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 运算符实际上只是方法调用的语法糖。