有没有办法让模型只有同一模块中的代码才能访问它?
类似的东西:
module SomeModule
class SomeActiveRecordModel
# has attribute `some_attribute`
...
end
end
module SomeModule
class SomeOtherClass
def self.sum_of_attribute
SomeActiveRecordModel.sum(:some_attribute)
end
end
end
class OutsideOfModule
def self.sum_of_attribute
SomeModule::SomeActiveRecordModel.sum(:some_attribute)
end
end
SomeModule::SomeOtherClass.sum_of_attribute # works
OutsideOfModule.sum_of_attribute # raises error
答案 0 :(得分:0)
简短的回答是否定的。这就是为什么
理想情况下,您希望在SomeModule
中实现此功能。但是当您在其他课程中调用SomeModule::SomeOtherClass.sum_of_attribute
时,您的范围为SomeModule::SomeOtherClass
。
SomeModule::SomeActiveRecordModel.sum(:some_attribute)
||
\/
module SomeModule
class SomeActiveRecordModel
def sum(*args)
# Here, self => SomeModule::SomeActiveRecordModel
# That's why you won't be able to do any meta trick to the module
# or classes in the module to identify if it's being invoked outside
end
end
end
所以你不知道原来的来电者是谁。
您可以通过调用堆栈来挖掘它。如果您想沿着这条路走下去,可能会发现另一个SO thread。{/ p>
答案 1 :(得分:0)
简而言之,没有。但这更多的是Ruby的方法和哲学问题。还有其他一种思考代码的方法,可以让你以更加Rubyesque的方式实现类似于你正在寻找的东西。
This answer涵盖了将事物设为私密的不同方式。