ActiveRecord查询返回不正确的模型

时间:2012-01-30 21:27:52

标签: ruby-on-rails activerecord

我已经在这一段时间里摸不着头脑了,虽然我确定这是一个愚蠢的错误,但我已经达到了必须咨询的地步,如果我要保留我留下的毛囊

我在Rails(3.1.2)中编写了一个函数,它应该返回一个填充了ActiveRecord模型对象(在本例中为用户)的数组,该数组满足一定的标准。标准是用户的当前列表(由字段active_list_id表示)不能为零。代码如下:

def build_list_array
   @lists = Array.new
   User.all.each do |user|
     @active_list_id = user.active_list_id
     @lists<< List.find(@active_list_id) if @active_list_id != nil #TODO WHAT?!? WHY IS  THIS RETURNING USERS?
   end
end

正如您所看到的,我正在初始化一个空数组,循环遍历所有用户并将其活动列表添加到数组中(如果用户记录上的相关引用不是nil)。问题是,这是返回用户对象,而不是列表对象。

以下是用户和列表模型的关联:

user model:
  has_many :lists
  has_many :tasks

list model:
  belongs_to :user

关于active_list的引用的简短说明:用户可以有许多列表,但只有一个列表在任何时候都是活动的。因此,我需要在用户记录中引用该列表。因此,活动列表不是典型意义上的外键。

我感谢你能给我的任何帮助......谢谢=)

4 个答案:

答案 0 :(得分:2)

each总是返回它迭代的集合(无论块内发生了什么)。听起来你想在方法结束时返回@lists

您好像正在好奇地使用实例变量。您也可以通过连接在一个查询中获取此内容,类似于

List.joins('inner join users on active_list_id =lists.id')

答案 1 :(得分:2)

目前,由于build_list_array的行为,您的User将返回each数组。使用each迭代集合时,对each的调用将返回原始集合。

例如,

list = []
# returns => []
[1,2,3,4,5].each { |number| list << number * 10 }
# returns => [1, 2, 3, 4, 5]
list
# returns => [10, 20, 30, 40, 50]

在您的代码中,build_list_array方法中的最后一个语句是each调用,这意味着each的返回值是方法返回的值。如果你只是在方法结束时添加了一个return语句,那么你就可以了。

def build_list_array
  @lists = Array.new
  User.all.each do |user|
    @active_list_id = user.active_list_id
    @lists<< List.find(@active_list_id) if @active_list_id
  end
  return @lists  # Actually return @lists
end

话虽如此,你应该使用Bradley的答案作为更“正确”的Rails代码的基础。

答案 2 :(得分:1)

Activerecord的Arel是你的朋友:

User.where(:active_list_id.not_eq => nil)

答案 3 :(得分:1)

扩展史蒂文的答案,获取名单

class User
  belongs_to :active_list, :class_name => "List"

def build_list_array
  @lists = User.where('active_list_id is not null').map(&:active_list).compact