我正在嘗試在 Rails 應用程式中實作購物車。為此,我試圖將這些模型粘合在一起:
user.rb
class User < ApplicationRecord
has_many :cart_contents
end
cart_content.rb:
class CartContent < ApplicationRecord
belongs_to :user
has_one :product
end
product.rb
class Product < ApplicationRecord
end
為了測驗這種安排是否有效,我在控制臺中嘗試了這個:
irb(main):006:0> cc = CartContent.new
=>
#<CartContent:0x000055679d802a28
...
irb(main):008:0> cc.user = User.find(1)
User Load (0.2ms) SELECT "users".* FROM [...]
=> #<User id: 1, email: "[email protected]", ...
irb(main):010:0> cc.product = Product.find(1)
Product Load (0.1ms) SELECT "products".* FROM [...]
/[...]/activemodel-7.0.0/lib/active_model/attribute.rb:211:
in `with_value_from_database': can't write unknown attribute `cart_content_id` (ActiveModel::MissingAttributeError)
我在這里錯過了什么?我需要表明與cart_contentin的關系product.rb嗎?
uj5u.com熱心網友回復:
一種可能的解決方案:您可能希望您CartContent的belongs_to :product.
class CartContent < ApplicationRecord
belongs_to :user
has_one :product # change this to belongs_to
end
cc.product = Product.find(1)
# .. can't write unknown attribute `cart_content_id` (ActiveModel::MissingAttributeError)
has_one將期望您的products表有一cart_content_id列。
請參閱指南部分2.7 在belongs_to 和 has_one 之間進行選擇
uj5u.com熱心網友回復:
為此,您需要在模型之間建立關系。正如 Jared 在此鏈接中提到的外鍵存在,您需要指定一個belongs_to 約束。
區別在于您放置外鍵的位置(它位于宣告belongs_to 關聯的類的表上)
class Product < ApplicationRecord
belongs_to :cart_content
end
如果您還想訪問用戶的所有產品,您可以在下面進行,但您可能不需要through關系。
class User < ApplicationRecord
has_many :cart_contents
has_many :products, through: :cart_contents
end
那么您的產品模型將如下所示
class Product < ApplicationRecord
belongs_to :cart_content
belongs_to :user
end
uj5u.com熱心網友回復:
我找到了一個適合我的解決方案。
product.rb
class Product < ApplicationRecord
has_one :cart_content
end
cart_content.rb
class CartContent < ApplicationRecord
belongs_to :user
belongs_to :product
end
user.rb
class User < ApplicationRecord
has_many :cart_contents
has_many :products, through: :cart_contents # for convenience
end
Rails 不再需要一cart_content_id列 onProduct并且以下命令都可以在控制臺中運行:
user = User.first
product = Product.first
cc = CartContent.new
cc.user = user
cc.product = product
cc.save
User.first.products # returns products currently in cart
轉載請註明出處,本文鏈接:https://www.uj5u.com/gongcheng/396592.html
