【问题标题】:Return ActiveRecord query as variable, not hash?将 ActiveRecord 查询作为变量返回,而不是哈希?
【发布时间】:2011-03-09 06:34:09
【问题描述】:

我正在对这样的模型进行 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

但是有没有办法从一开始就检索这个结果? (即不经过额外处理?)。如果没有,有什么更简洁的方法来做这个处理?

谢谢。

【问题讨论】:

    标签: ruby-on-rails ruby activerecord hash


    【解决方案1】:

    尝试:

    @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)
    

    【讨论】:

    • 你能解释一下吗?
    【解决方案2】:

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

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

    【讨论】:

    • 您需要在'year')map! 之间添加一个点,以及为什么使用map!map 在这里可以正常工作,因为您将结果分配给一个新变量
    【解决方案3】:

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

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

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

    【讨论】:

      猜你喜欢
      • 2014-06-14
      • 2020-04-05
      • 2018-04-10
      • 2020-03-12
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2016-08-12
      • 1970-01-01
      相关资源
      最近更新 更多