在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模型