2016-01-17 5 views
0

У меня есть три модели, и я пытаюсь получить людей в соответствующих командах, связанных с продуктами.NoMethodError on has_many отношения ruby ​​on rails

Продукт

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

Team

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

Person

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

изменил его, где сейчас NoMethodError (не определен метод 'команды 'для # <Продукт :: ActiveRecord_Relation: 0x4a97c18>): – christoandrew

ответ

3

NoMethodError (не определен метод `счетчик» для команды: 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 
+0

теперь есть этот NoMethodError (неопределенный метод' команда' для # <Продукт :: ActiveRecord_Relation: 0x4a97c18>) : – christoandrew

+0

@christoandrew Я обновил свой ответ. – Pavan

+0

спасибо, что человек работал как магия – christoandrew

1

Функция подсчета, к которой вы обращаетесь, не является массивом, поэтому вы получите эту ошибку. Вы можете сделать это:

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

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

Или использовать где предложение упоминаемый Павана

1

Просто, чтобы добавить что-то дополнительное (.try):

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

Вы бы затем использовать некоторую условную логику в front-end:

<% if @team %> 

... который в основном такой же узор у вас есть сейчас.