has_one与has_many有什么不同?

时间:2012-08-17 15:08:13

标签: ruby-on-rails ruby-on-rails-3 ruby-on-rails-3.2

我有两种模式:

class Product < ActiveRecord::Base
  attr_accessible :amount, :name, :unit, :description, :stock, :limit
  has_many :cart_rows
  has_one :inquery
end

class Inquery < ActiveRecord::Base
  attr_accessible :product, :text, :phone, :zip, :product_id, :state, :street, :city
  belongs_to :product
end

在我的Inqueries视图索引中,我有:

<% @inqueries.each do |inquery| %>
  <%= inquery.product.name %>
  <%= inquery.text %>
<% end %>

我收到以下错误:undefined method 'name' for nil:NilClass

我做错了什么? has_one的行为与has_many的行为不同吗?

3 个答案:

答案 0 :(得分:2)

不,您应该可以致电inquery.product。你可能有一个没有产品的问题。

在控制台(rails c)中,运行:Inquery.where(product_id: nil),看看是否有结果。

您应该在Inquery模型中验证产品的存在:

validates :product, presence: true

答案 1 :(得分:2)

您有一个没有附加产品的Inquery。

当您致电inquery.product时,您将返回一个零值,然后当您在零值上调用.name时,您将收到错误消息。这与has_one或has_many

无关

答案 2 :(得分:1)

我根据您在此处描述的信息构建了一个应用程序,并且能够通过具有产品的nil值的Inquery记录(也用于文本)来重现您的问题。您可能希望添加更好的验证器,以便无法保存带有nils的Inqueries。

以下是我的rails控制台会话中的粘贴:

  Inquery Load (0.1ms)  SELECT "inqueries".* FROM "inqueries" 
#<Inquery:0x00000002c03e40>
 => [#<Inquery id: 1, text: nil, phone: nil, zip: nil, product_id: nil, state: nil, street: nil, city: nil, created_at: "2012-08-17 15:23:49", updated_at: "2012-08-17 15:23:49">] 

1.9.3p194 :002 > Inquery.all.each { |n| puts n.product.name }
  Inquery Load (0.2ms)  SELECT "inqueries".* FROM "inqueries" 
NoMethodError: undefined method `name' for nil:NilClass

顺便说一句,现在对于一些未经请求的建议:与关键字“text”同名的字段是一个非常糟糕的主意。今天你可能不会用脚射击自己,但是你会在某个时候。考虑将文本字段重命名为usertext或description或类似的内容。