ruby on rails 3 - named_scope and .first?



我可以返回一个对象集合,只有一个(: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,这就是为什么您能够在它上链接方法。

firstfindall一样,从数据库返回实际结果。因此,它在范围内不起作用。

话虽如此,你可以在你的模型上定义你自己的类方法,它给出了你想要的行为(因为在我输入这个时,已经有两个人回答了)。事实上,Rails社区中许多受人尊敬的开发人员建议这样做,而不是使用作用域。由于使用scope类宏只是定义类方法本身,所以这并没有什么负面影响,而且它有灵活性的好处(就像这里的情况一样)。

定义一个类方法来实现这一点:

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

first已经对查询执行了一个隐含的limit 1,AND将根据表的主键对其进行排序,因此您总是会得到第一个。

相关内容

  • 没有找到相关文章