named_scope和.first?

时间:2011-06-09 20:48:18

标签: ruby-on-rails-3 named-scope

我可以返回一个对象集合,只有一个(: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()应用于结果,但我只是想清理代码并使其不易出错。

3 个答案:

答案 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,如findall,返回数据库中的实际结果。因此,它不适用于范围。

所有这一切,你可以在你的模型上定义你自己的类方法,给出你想要的行为(因为我在输入时已经回答了2个人)。实际上建议使用Rails社区中许多备受推崇的开发人员使用范围。因为使用scope类宏只是本身定义了类方法,所以这并没有真正的缺点,它具有灵活性的好处(就像你的情况一样)。

答案 2 :(得分:3)

定义一个类方法来执行此操作:

def profile
  where(:association => "owner", :resource_type => 'Profile').first
end

first已经对查询执行了隐式limit 1,并且会按表的主键对其进行排序,因此您将始终获得第一个。