私は、モジュールを含むクラスからアクセスできないメソッドを、モジュール内に持たせたいと思っています。次の例を考える:含まれているモジュールメソッドをどのようにして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は細かい:(
に動作します私はRubyで何をしたいかを達成するための方法はあります
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'を実行した場合に壊れるはずです。 –