2012-11-11 2 views
1

У меня есть следующий метод внутри моего Business класса:модели Извлечение, которые похожи - Рельсы

def similar_businesses(n) 
    Business.where(:category_id => category_id, :city_id => city_id).where("id NOT IN (?)",id).limit(n).order("RANDOM()") 
end 

Это в основном захватывает n предприятия, которые находятся в одной и той же категории и того же города.

Я смотрел на railscast, что переговоры об использовании методов класса вместо областей, и пытался конвертировать мой код в:

def similar_businesses(n) 
    where(:category_id => category_id, :city_id => city_id).where("id NOT IN (?)",id).limit(n).order("RANDOM()") 
end 

Уведомление Business не существует больше.

Однако я получаю сообщение об ошибке undefined where method for ...

Я только начал рельсы, и я также интересно, если есть какая-то разница между этими двумя методами? И почему я получаю эту ошибку?

ответ

1

Похоже, вы хотите использовать similar_businesses как метод класса вместо например метода. Разница между ними заключается в том, что вы играете метод класса для классов, например Business, и применяете метод экземпляра для чего-то вроде @business = Business.new.

Попробуйте использовать

def self.similar_businesses(n) 
    where(:category_id => category_id, :city_id => city_id).where("id NOT IN (?)",id).limit(n).order("RANDOM()") 
end 
+0

Хорошо, я это понимаю. Будет ли более эффективен, чем другой? – AlexBrand

+0

В приведенном выше случае нет никакой разницы в эффективности, потому что вы в основном делаете то же самое, таким же образом. –

1

Вам необходимо определить метод как def self.similar_businesses, чтобы сделать его методом класса.

+0

Я изменилась, и теперь я получаю 'неопределенный метод 'similar_businesses' для # <Бизнес: 0x007fb4e2497458>'. Как я могу вызвать метод класса из экземпляра? – AlexBrand

+1

Вы не можете (ну, вы можете получить класс из экземпляра и называть его, но вам не нужно). Просто назовите его так: 'Business.similar_businesses'. – Russell

Смежные вопросы