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

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

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

21
задан NullVoxPopuli 11 August 2010 в 18:41
поделиться

2 ответа

Один из возможных способов - поместить общие методы в модуль , как это ( 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 / issues вместо 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
45
ответ дан 29 November 2019 в 19:59
поделиться

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

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

class ChildModel < BaseModel
end

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

6
ответ дан 29 November 2019 в 19:59
поделиться
Другие вопросы по тегам:

Похожие вопросы: