在关联声明中使用“self”(:has_many,:has_one)

我需要在:has_many声明中引用模型的self。

我有一节课我们会打电话给Foo。 Foo:has_many Bar。 Foo有一个名为randomize的布尔属性,用于确定:has_many关系中Bars的顺序。 如果randomize为true,则它们按“RAND()”或“RANDOM()”排序,具体取决于DB。 如果没有,它们按id排序。 我必须在协会上发表这个声明,因为我正在使用预先加载。 我很清楚我可以在Foo中定义一个返回我想要的方法,但我需要一次加载所有内容,否则单独运行400-500个查询=坏。

class CreateFoo  false end end end 

 class CreateBar < ActiveRecord::Migration def self.up create_table :bars do |t| t.string :name t.references :foo end end end 

 class Bar < ActiveRecord::Base belongs_to :foo end 

 class Foo  self.randomize ? 'RAND()' : 'id' end 

如何在has_many声明中访问self的属性?

我尝试过但失败的事情:

  1. 创建一个返回正确字符串的Foo方法
  2. 创建一个lambda函数
  3. 哭了

这可能吗?

问题似乎在于:has_many中的“self”不属于Foo类型:

 undefined method `randomize' for # 

是我得到的错误之一。 注意它是一般的类,而不是Foo对象……为什么?

事实certificate,Ryan Bates在Railscast中触及了一个类似的主题。 你需要在方法之后定义范围……

在这种背景下的自我是阶级。

要做你需要的,你可以尝试传递一个lambda。

 class Foo < AR::Base has_many :bars, :order => lambda { self.randomize? ? 'RAND()' : 'id' } end 

我没有测试过,但它应该工作。

尝试使用默认范围而不是has_many声明

 class Bar < ActiveRecord::Base default_scope lambda { order(self.randomize ? 'RAND()' : 'id') } 

但是直接回答你的问题,你的has_many声明中的self指的是Foo类,而不是Foo的实例。