在Rails,ActiveRecord对象中,属性可以通过方法和Hash访问。例如:
user = User.first # Assuming User to be inheriting from ActiveRecord::Base
user.name # Accessing attribute 'name' via method
user[:name] # Attribute 'name' is accessible via hash as well
如何通过散列访问实例变量,以便不继承ActiveRecord::Base
?
答案 0 :(得分:3)
它不是"通过Hash"它是"阵列访问"操作
要实现它,您需要定义方法:
def [](*keys)
# Define here
end
def []=(*keys, value)
# Define here
end
当然,如果您不能使用多个键来访问元素,那么仅使用key
代替*keys
就可以了,所以您还没有键数组(即使只给出一个键),但只有一个键。
很多其他类实现它,即Struct
,因此您可以自由选择现有的实现或推出自己的实现。
让实例变量受这些方法的影响意味着使用instance_variable_get
/ instance_variable_set
来实现它们。没什么好看的。
答案 1 :(得分:0)
一般来说,为了使属性可用作Hash和/或getter / setter,您可以将属性存储在单个Hash中,并提供相应的getter / setter方法。
这是一个非常简单的功能,您可以轻松地直接编入目标类。
在Ruby中,还有一些内置库提供了类似的功能,方法略有不同:Struct
和OpenStruct
。
以下是使用Struct
定义对象的示例。
Customer = Struct.new(:name, :address, :zip)
joe = Customer.new("Joe Smith", "123 Maple, Anytown NC", 12345)
joe["name"] #=> "Joe Smith"
joe[:name] #=> "Joe Smith"
joe[0] #=> "Joe Smith"
如果您使用的是Rails,则还可以包含ActiveModel::Model
以获得类似ActiveRecord的功能。