我可以返回一个对象集合,只有一个(: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()应用于结果,但我只是想清理代码并使其不易出错。
答案 0 :(得分:7)
您可能需要创建一个类方法:
def self.profile
where(:association => 'owner', :resource_type => 'Profile').first
end
请注意,使用Rails 3时,您应使用where(...)
语法,并且在执行.first
时,您无需指定限制。
答案 1 :(得分:5)
首先,如果您使用的是Rails 3,则应使用scope
而不是named_scope
。同样的,不同的,错误的名称(named_scope
仍然可以使用,但不推荐使用)。现在已经不在了......
范围(或命名范围)采用两个参数(一个符号和一个lambda或一个哈希),并在该模型上定义一个返回ActiveRecord :: Relation的类方法,这就是为什么你能够链接方法的原因在它上面。
first
,如find
或all
,返回数据库中的实际结果。因此,它不适用于范围。
所有这一切,你可以在你的模型上定义你自己的类方法,给出你想要的行为(因为我在输入时已经回答了2个人)。实际上建议使用Rails社区中许多备受推崇的开发人员使用范围。因为使用scope
类宏只是本身定义了类方法,所以这并没有真正的缺点,它具有灵活性的好处(就像你的情况一样)。
答案 2 :(得分:3)
定义一个类方法来执行此操作:
def profile
where(:association => "owner", :resource_type => 'Profile').first
end
first
已经对查询执行了隐式limit 1
,并且会按表的主键对其进行排序,因此您将始终获得第一个。