我可以返回一个对象集合,只有一个(:limit=>1),但有没有办法只返回.first()对象,就像不在集合中一样?
named_scope :profile, :conditions => {:association => 'owner', :resource_type => 'Profile'}, :limit => 1 # => collection of 1 profile but I want the profile only NOT in a collection or array
解决方法只是将.first()应用于结果,但我只想清理代码,使其不太容易出错。
您可能需要创建一个类方法:
def self.profile
where(:association => 'owner', :resource_type => 'Profile').first
end
请注意,对于Rails3,您应该使用where(...)
语法,并且在执行.first
时,不需要指定限制。
首先,如果您使用的是Rails 3,则应该使用scope
而不是named_scope
。相同、不同、错误、名称(named_scope
仍然有效,但已弃用)。现在这已经不成问题了…
一个作用域(或命名作用域)接受两个参数(一个符号和一个lambda或一个散列),并在该模型上定义一个类方法,该方法返回ActiveRecord::Relation,这就是为什么您能够在它上链接方法。
first
与find
或all
一样,从数据库返回实际结果。因此,它在范围内不起作用。
话虽如此,你可以在你的模型上定义你自己的类方法,它给出了你想要的行为(因为在我输入这个时,已经有两个人回答了)。事实上,Rails社区中许多受人尊敬的开发人员建议这样做,而不是使用作用域。由于使用scope
类宏只是定义类方法本身,所以这并没有什么负面影响,而且它有灵活性的好处(就像这里的情况一样)。
定义一个类方法来实现这一点:
def profile
where(:association => "owner", :resource_type => 'Profile').first
end
first
已经对查询执行了一个隐含的limit 1
,AND将根据表的主键对其进行排序,因此您总是会得到第一个。