Если несколько моих моделей имеют столбец конфиденциальности, есть ли способ, которым я могу записать, что один метод, совместно использованный всеми моделями, позволяет, называют это is_public?
таким образом я хотел бы смочь сделать object_var.is_public?
Один из возможных способов - поместить общие методы в модуль
, как это ( 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
Вы также можете сделать это, унаследовав модели от общего предка, который включает общие методы.
class BaseModel < ActiveRecord::Base
def is_public?
# blah blah
end
end
class ChildModel < BaseModel
end
На практике подход jigfox часто работает лучше, поэтому не чувствуйте себя обязанным использовать наследование просто из любви к теории ООП :)