我希望能够在模块中定义一些方法,但这些方法不能被包含该模块的类所访问。以下是一个示例:
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将工作正常 :(
在Ruby中有实现我想要做的事情的方法吗?
更新-真正的代码
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上的某个方法或任何其他包含在Place.rb中的模块的情况下,对此模块进行重构。
Bar#do_stuff
本质上是对common_method_name
的公共接口,因此代码不应该出现任何逻辑错误。只有在执行Foo.new.common_method_name
时才会出现错误。 - Alexander Popov