在关联声明中使用“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的属性?
我尝试过但失败的事情:
- 创建一个返回正确字符串的Foo方法
- 创建一个lambda函数
- 哭了
这可能吗?
问题似乎在于: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的实例。