我希望能够在模块中拥有包含该模块的类无法访问的方法。考虑下面的例子:如何在Ruby中封装包含的模块方法?
class Foo
include Bar
def do_stuff
common_method_name
end
end
module Bar
def do_stuff
common_method_name
end
private
def common_method_name
#blah blah
end
end
我想Foo.new.do_stuff炸毁,因为它试图访问该模块试图从一个隐藏的方法。在上面的代码,但是,Foo.new.do_stuff将正常工作:(
有没有办法达到我想要的红宝石做
UPDATE - 真正的代码
class Place < ActiveRecord::Base
include RecursiveTreeQueries
belongs_to :parent, {:class_name => "Place"}
has_many :children, {:class_name => 'Place', :foreign_key => "parent_id"}
end
module RecursiveTreeQueries
def self_and_descendants
model_table = self.class.arel_table
temp_table = Arel::Table.new :temp
r = Arel::SelectManager.new(self.class.arel_engine).from(model_table).project(model_table.columns).join(temp_table).on('true').where(model_table[:parent_id].eq(temp_table[:id]))
nr = Place.scoped.where(:id => id)
q = Arel::SelectManager.new(self.class.arel_engine)
as = Arel::Nodes::As.new temp_table, nr.union(r)
arel = Arel::SelectManager.new(self.class.arel_engine).with(:recursive,as).from(temp_table).project(temp_table[:id])
self.class.where(model_table[:id].in(arel))
end
def self_and_ascendants
model_table = self.class.arel_table
temp_table = Arel::Table.new :temp
r = Arel::SelectManager.new(self.class.arel_engine).from(model_table).project(model_table.columns).join(temp_table).on('true').where(temp_table[:parent_id].eq(model_table[:id]))
nr = Place.scoped.where(:id => id)
q = Arel::SelectManager.new(self.class.arel_engine)
as = Arel::Nodes::As.new temp_table, nr.union(r)
arel = Arel::SelectManager.new(self.class.arel_engine).with(:recursive,as).from(temp_table).project(temp_table[:id])
self.class.where(model_table[:id].in(arel))
end
end
很明显,这段代码被黑掉了,由于一些严重的重构,我的问题的目的是要找出是否有一种方法,我可以重新构建这个模块,而无意中覆盖ActiveRecord :: Base或任何其他模块的一些方法in Place.rb。
至于第一个例子 - 'Bar#do_stuff'本质上是一个到'common_method_name'的公共接口,所以没有任何逻辑代码应该被破坏。如果你做了'Foo.new.common_method_name',它应该会中断。 – 2014-06-06 17:41:08