Ruby on Rails: общий метод для моделей - PullRequest
20 голосов
/ 11 августа 2010

Если у некоторых из моих моделей есть столбец конфиденциальности, могу ли я написать один метод, общий для всех моделей, давайте назовем его is_public?

Итак, я хотел бы иметь возможность делать object_var.is_public?

Ответы [ 2 ]

43 голосов
/ 11 августа 2010

Один из возможных способов - поместить методы общего доступа в module, например так (RAILS_ROOT/lib/shared_methods.rb)

module SharedMethods
  def is_public?
    # your code
  end
end

Затем вам необходимо включить этот модуль в каждую модель, которая должна иметь эти методы (т.е. app/models/your_model.rb)

class YourModel < ActiveRecord::Base
  include SharedMethods
end

ОБНОВЛЕНИЕ :

В Rails 4 есть новый способ сделать это.Вы должны поместить общий код, как это, в app/models/concerns вместо lib

Также вы можете добавить методы класса и выполнить код при включении, как этот

module SharedMethods
  extend ActiveSupport::Concern

  included do
    scope :public, -> { where(…) }
  end

  def is_public?
    # your code
  end

  module ClassMethods
    def find_all_public
      where #some condition
    end
  end
end
6 голосов
/ 11 августа 2010

Вы также можете сделать это, унаследовав модели от общего предка, который включает общие методы.

class BaseModel < ActiveRecord::Base
  def is_public?
    # blah blah
   end
end

class ChildModel < BaseModel
end

На практике подход jigfox часто работает лучше, поэтомуне чувствую себя обязанным использовать наследование просто из любви к теории ООП:)

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