Rails 3:Scope返回一个数组

时间:2011-10-26 10:34:15

标签: ruby-on-rails activerecord scope

我正在使用范围来获取特定用户的项目:

在物品模型中

belongs_to :user    
scope :for_user, lambda { |user| where(:user_id => user) }

用户模型

has_many :items

问题

调用Item.includes(:user).for_user(3)时,返回的是Array而不是ActiveRecord关系。 我希望它的行为类似Item.includes(:user).find_by_user_id(3),它返回一个ActiveRecord关系。

感谢您的帮助。

2 个答案:

答案 0 :(得分:3)

如果你做更多的调查,你会发现它确实会返回一个关系对象。

但它会在必要时将其转换为数组。

即,如果您在控制台中并说> Item.includes(:user).for_user(3),它会尝试检查它,然后进行转换。

但无论如何,以下方法都可行

scope = Item.includes(:user).for_user(3)

# does a db count
scope.count

# does a db select limit 1
scope.first

# does a full db select
scope.all

答案 1 :(得分:0)

使用where(:user_id => user)而不是像find_by_user_id这样的动态方法总会返回一个数组。如果您只对范围内返回的第一条记录感兴趣,可以将范围更改为

scope :for_user, lambda { |user| where(:user_id => user).first }