将ActiveRecord查询作为变量返回,而不是哈希?

时间:2010-06-28 18:03:58

标签: ruby-on-rails ruby activerecord hash

我正在对模型进行ActiveRecord查找

@foo = MyModel.find(:all, :select => 'year')

如您所见,我只需要年份列,因此我的理想输出将是

["2008", "2009", "2010"]

相反,我得到了一个模型的哈希值,每个模型包含年份,如下:

[#<MyModel year: "2008">, #<MyModel year: "2009">, #<MyModel year: "2010">]

我可以循环使用它,将其转换为我的理想输出:

@years = []
for bar in @foo
    @years.push(bar.year)
end

但有没有办法检索此结果? (即没有经过额外的处理?)。如果没有,有什么更简洁的方法来进行这种处理?

谢谢。

3 个答案:

答案 0 :(得分:4)

尝试:

@foo = MyModel.find(:all, :select => 'year').map(&:year)

您还可以在结果上调用.uniq()以删除重复项。

@foo = MyModel.find(:all, :select => 'year').map(&:year).uniq

这是

的缩写形式
@foo = MyModel.find(:all, :select => 'year').map{ |model| model.year }

这循环遍历MyModel数组,并在块(model.year)中创建一个新的返回值数组。

甚至更短的代码,但首先从db:

调用所有内容
@foo = MyModel.all.map(&:year)

答案 1 :(得分:1)

如果您不想实例化模型,您可以这样做:

MyModel.connection.select_values("SELECT year FROM my_models")

这将返回一个String对象数组。然后,您可以根据需要使用Ruby工具进行转换。

答案 2 :(得分:0)

您可以使用map更改数组中的每个值。例如:

@foo = MyModel.find(:all, :select => 'year').map { |model_object| model_object.year }