Если в некоторых моих моделях есть столбец конфиденциальности, есть ли способ написать один метод, общий для всех моделей, позвоните ему 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 часто работает лучше, поэтому не чувствуйте себя обязанным использовать наследование просто из-за любви к теории ООП:)