Ruby on Rails: общий метод между моделями

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

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

Ответы

Ответ 1

Один из возможных способов - поместить общие методы в 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

UPDATE

В 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

Ответ 2

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

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

class ChildModel < BaseModel
end

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