在Ruby / Rails模型/控制器中引用关联/属性时,*,self。*和@ *之间的差异
假设Rails模型具有持久性/非持久性属性,那么引用它们的最佳实践是什么? 如果查看公开提供的代码,则会使用不同的模式。
例如,如果您有一个模型与另一个模型的关联。 使用self.association_name和@association_name有什么区别? 。 什么是更好的方式?
与在模型中使用attr_accessor:attr定义的非持久属性相同。 您可以使用self.attr和@attr两种方法引用它们。 什么是更好的方式?
self.x
/ self.x=y
总是方法调用。
( self.x
只是自己的糖self.__send__(:x)
和self.x = y
实际上只是自己的糖self.__send__(:x=, y)
)
另一方面,@ @x
仅指 实例变量 。
使用@x
不能与AR关联一起使用,因为AR仅为其神奇的操作定义了x/x=
( 它们是方法 )。 (AR本质上只是通过这些方法“捕获”意图访问,并通过自己的内部数据结构路由,这些数据结构与任何类似命名的实例变量无关 。)
attr_accessor
允许“访问两种方式” ,因为它只使用与其支持相同的实例变量(它必须在某处存储值)。 考虑到attr_accessor :x
相当于:
def x; @x; end def x= (y); @x = y; end
快乐的编码。
大多数情况下,您更喜欢使用attr
而不是@attr
。 这是因为方法attr
经常设置属性,如果它不存在。
例如,此模型订单:
model Order have_many :items def total @total ||= items.collect(&:price).sum end def taxes @taxes ||= total * 0.10 end end
如果我在方法taxes
使用了@total
而不是total,那么这个模型就可以工作了,如果我之前没有在这个对象上调用方法total
,那么calcul就会失败。
正如@pst指出的那样, @association_name
不适用于关联,您必须使用方法association_name
。
另外self.attr
应该只用于设置一个属性(调用self.attr=
),在读取你最好使用attr
的值时,请参阅这篇文章:何时使用自我Rails模型