我一直有点难以理解整个有很多概念以及它如何在Rails中运行,我认为它可以为你工作,因为我习惯于手动构建关联。我目前有一个计费系统,我正在尝试创建一个订单部分,显然我的订单必须有很多产品,所以我将数据库规范化为第三范式,以便订单和产品通过另一个链接表名为有序产品,此表包含订单的ID和产品的ID,以及订购的产品数量。我根据我所知道的has_Many创建了模型:通过代码学校教程中的Rails,然而我已经完全复制了它们的方式,但是我和它们之间必定存在某些区别。这是我目前拥有的模型文件:
订单型号:
class Order < ActiveRecord::Base
attr_accessible :ClientID, :OrderTotal
has_many :orderedproducts
has_many :products, through: :orderedproducts, :source => :product
end
订购产品型号:
class Orderedproduct < ActiveRecord::Base
attr_accessible :OrderID, :ProductID, :QuantityOrdered
belongs_to :order
belongs_to :product
end
产品型号:
class Product < ActiveRecord::Base
#This line makes these elements accessible outside of the class.
attr_accessible :ProductName, :ProductPrice, :ProductQuantity, :ProductSupplier
has_many :orderedproducts
has_many :orders, through: :orderedproducts, :source => :order
#These attributes ensure that the data entered for each element is valid and present.
validates_presence_of :ProductName
validates_presence_of :ProductPrice
validates_numericality_of :ProductPrice
validates_presence_of :ProductQuantity
validates_numericality_of :ProductQuantity
validates_presence_of :ProductSupplier
end
我添加了source属性,因为我在控制台中收到错误,建议我将source属性添加到has_many:through行。当我尝试将产品添加到订单时,这是我在控制台中收到的错误:
irb(main):017:0> order.products = Product.find(4)
Product Load (0.3ms) SELECT `products`.* FROM `products` WHERE `products`.`id` = 4 LIMIT 1
ActiveRecord::HasManyThroughSourceAssociationNotFoundError: Could not find the source association(s) :ProductID in model Orderedproduct. Try 'has_many :products, :through => :orderedproducts, :source => <name>'. Is it one of :order or :product?
from /usr/local/rvm/gems/ruby-2.0.0-p0/gems/activerecord-3.2.13/lib/active_record/reflection.rb:509:in `check_validity!'
from /usr/local/rvm/gems/ruby-2.0.0-p0/gems/activerecord-3.2.13/lib/active_record/associations/association.rb:26:in `initialize'
from /usr/local/rvm/gems/ruby-2.0.0-p0/gems/activerecord-3.2.13/lib/active_record/associations/collection_association.rb:24:in `initialize'
from /usr/local/rvm/gems/ruby-2.0.0-p0/gems/activerecord-3.2.13/lib/active_record/associations/has_many_through_association.rb:10:in `initialize'
from /usr/local/rvm/gems/ruby-2.0.0-p0/gems/activerecord-3.2.13/lib/active_record/associations.rb:160:in `new'
from /usr/local/rvm/gems/ruby-2.0.0-p0/gems/activerecord-3.2.13/lib/active_record/associations.rb:160:in `association'
from /usr/local/rvm/gems/ruby-2.0.0-p0/gems/activerecord-3.2.13/lib/active_record/associations/builder/association.rb:51:in `block in define_writers'
from (irb):17
from /usr/local/rvm/gems/ruby-2.0.0-p0/gems/railties-3.2.13/lib/rails/commands/console.rb:47:in `start'
from /usr/local/rvm/gems/ruby-2.0.0-p0/gems/railties-3.2.13/lib/rails/commands/console.rb:8:in `start'
from /usr/local/rvm/gems/ruby-2.0.0-p0/gems/railties-3.2.13/lib/rails/commands.rb:41:in `<top (required)>'
from script/rails:6:in `require'
from script/rails:6:in `<main>'
答案 0 :(得分:1)
在这种情况下,它是product =方法;订单没有'产品',它有很多'产品'。
你可以:
order.products << some_product
不幸的是,CamelCase也是一个问题。 Order和Product中的关联将分别查找order_id或product_id,但不会找到它们。解决方案是将列名更改为snake_case,或添加:foreign_key =&gt; ......选项。
答案 1 :(得分:0)
因为订单has_many产品,你从Rails获得#products方法,而不是#product方法。
您可以使用Order实例创建相关的OrderedProducts,并将Product添加到该实例。
order = Order.new
ordered_product = order.ordered_products.build
ordered_product.product = Product.find(4)
订单上#product方法的问题是有一个集合,那么你的代码如何知道你的意思?
答案 2 :(得分:0)
我使用了错误的数组运算符,应该是&lt;&lt;运算符而不是=运算符,因为我在数组中添加了一个元素。