关于rails上has_many关系ruby的NoMethodError

时间:2016-01-17 07:49:59

标签: ruby-on-rails activerecord relationships

我有三个模型,我正在尝试让各个团队中的人员与产品相关联。

产品

class Product < ActiveRecord::Base
   mount_uploader :photo, ImageUploader
   has_one :team
end

class Team < ActiveRecord::Base
 has_many :persons
 belongs_to :product
end

class Person < ActiveRecord::Base
 mount_uploader :photo, ImageUploader
 belongs_to :team
end

当我尝试这个电话时

@product = Product.find_by(name: params[:name])
if @product.team.count > 0
  @team = @product.team.persons
end

我得到了

NoMethodError (undefined method `count' for #<Team:0x90dc098>):

3 个答案:

答案 0 :(得分:3)

  

NoMethodError(Team的未定义方法`count':0x90dc098)

count适用于ActiveRecord::Relation数组。此处find_by返回单个记录而不是ActiveRecord::Relation。将find_by更改为where应该有效。

@product = Product.where(name: params[:name]).first
if @product.team.count > 0
  @team = @product.team.persons
end

答案 1 :(得分:1)

您申请的计数功能不是数组,因此您会收到该错误。你可以这样做:

@product = Product.find_by(name: params[:name])

if @product.team.present? 
  @team = @product.team.persons 
end

或使用Pavan提到的where子句

答案 2 :(得分:1)

只需添加额外的内容(.try):

@product = Product.find_by name: params[:name]
@team    = @product.try(:team).try(:persons) #-> returns false if team or persons nil

然后在前端使用一些条件逻辑:

<% if @team %>

...这与你现在的模式基本相同。