Куда помещать «полезные» функции модели в Ruby on Rails - PullRequest
27 голосов
/ 07 августа 2009

У меня есть приложение rails с несколькими моделями.

У меня есть функция, к которой я хочу получить доступ из нескольких моделей.

Как лучше всего разместить этот код и как я могу сделать его доступным для моделей, которым нужно его найти?

Насколько я понимаю, помощники только для взглядов. Это правильно?

Кажется неправильным создать плагин и поместить его в папку vendor - это мой код и неотъемлемая часть моего приложения Это правильно?

Спасибо.

Ответы [ 2 ]

31 голосов
/ 07 августа 2009

Самое простое решение - создать модуль в lib и смешать его с нужными ему моделями, например, в lib / fooable.rb:

module Fooable
  def do_foo
  end
end

А потом в ваших различных моделях:

class MyModel < ActiveRecord::Base
  include Fooable
end

Нет необходимости требовать fooable.rb, механизм автозагрузки Rails найдет его для вас, если он назван с использованием правильных соглашений.

1 голос
/ 07 августа 2009

Чтобы уменьшить количество повторений кода, вы также можете создать основной класс, который будет включать этот модуль и просто наследовать его от каждой модели, которой вы хотите поделиться.

Что-то вроде:

module Fooable
  def do_foo
  end
end

class ParentModel < ActiveRecord::Base
  include Fooable
end

class Product < ParentModel end
class User < ParentModel end
class Item < ActiveRecord::Base end

Таким образом, в этом примере и Продукт, и Пользователь будут использовать функциональность do_foo, а Элемент - нет.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...