【问题标题】:NoMethodError on has_many relationship ruby on rails轨道上has_many关系红宝石上的NoMethodError
【发布时间】:2016-01-17 07:49:59
【问题描述】:

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

产品

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>):

【问题讨论】:

  • 将其更改为现在 NoMethodError(#<:activerecord_relation:0x4a97c18> 的未定义方法 `team'):

标签: ruby-on-rails activerecord relationships


【解决方案1】:

NoMethodError(Team: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

【讨论】:

  • 现在有这个 NoMethodError(#<:activerecord_relation:0x4a97c18> 的未定义方法 `team'):
  • 干得好@Pavan - 很好地了解底层 ruby​​ 功能
【解决方案2】:

您应用的计数函数不是数组,因此您会收到该错误。你可以这样做:

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

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

或者使用 Pavan 提到的 where 子句

【讨论】:

    【解决方案3】:

    只是添加一些额外的东西(.try):

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

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

    <% if @team %>
    

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

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2022-08-15
      • 1970-01-01
      • 1970-01-01
      • 2012-05-30
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多