我已经在这一段时间里摸不着头脑了,虽然我确定这是一个愚蠢的错误,但我已经达到了必须咨询的地步,如果我要保留我留下的毛囊
我在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的引用的简短说明:用户可以有许多列表,但只有一个列表在任何时候都是活动的。因此,我需要在用户记录中引用该列表。因此,活动列表不是典型意义上的外键。
我感谢你能给我的任何帮助......谢谢=)
答案 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