如果我的一些模型有一個隱私列,有沒有辦法可以寫出所有模型共享的一種方法,我們可以稱之爲is_public?Ruby on Rails:模型之間的共享方法
所以,我想能夠做object_var.is_public?
如果我的一些模型有一個隱私列,有沒有辦法可以寫出所有模型共享的一種方法,我們可以稱之爲is_public?Ruby on Rails:模型之間的共享方法
所以,我想能夠做object_var.is_public?
一種可能的方式是把共享方法在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有一個new way要這樣做。你應該把從一個共同的祖先繼承模型的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
你也可以做到這一點共享這樣的代碼,其包括共享方法。
class BaseModel < ActiveRecord::Base
def is_public?
# blah blah
end
end
class ChildModel < BaseModel
end
在實踐中,jigfox的做法通常能夠直接越好,所以不要覺得有義務使用繼承僅僅是出於愛的OOP理論:)
我想這樣做。但我不能讓它工作...... :( – 2014-09-25 20:21:14
但我需要通過一個變量告訴方法我正在使用什麼類... – NullVoxPopuli 2010-08-11 19:14:56
self.class會給你所調用的方法上下文中的任何類。所以,舉個例子,如果你做了YourModel.new.is_public?,self.class就是YourModel。 – lambdabutz 2010-08-11 19:17:36