`

如何:Rails 查询返回array

阅读更多

看到类似的文,转回来,翻译一下顺便研讨。

讨论的核心,就是查询的时候,希望能返回一个array的数据。比如,符合条件的id组成的数组。

然后,如果是我的话,我首先会
Model.find(:all,:conditions=>["?",params]).collect{|mod|mod.id}

可能没有考虑效率的问题。好吧,还是看看原文作者想说啥吧:

作者,首先想到的是:
Model.find(:all, :select => 'id')

但是,这样只能返回一个model实例和id的序列,如下:
>> User.find(:all,:select=>'id')
#=> [#<User id: 1>, #<User id: 2>, #<User id: 3>, #<User id: 4>, #<User id: 5>]


然后,原文作者就想了,如果,需要的是值对的序列(array of values),那就用select_values吧,如下:
>> User.connection.select_values("select id from users")
#=> ["1", "2", "3", "4", "5"]

喔,显然,这样是可以实现目地了。但是,文主,并不满意而且考虑如果在复杂查询的情况下,还希望能使用Rails的finder方法。

于是,文主说使用construct_finder_sql,这个东西我比较不熟悉
如下使用:
sql = Model.send(:construct_finder_sql, :select => 'id', :conditions => [...])
Model.connection.select_values(sql)


试了试,还是挺好用的如下:
>> sql=User.send(:construct_finder_sql,:select=>'id',:conditions=>["id <= 4"])
#=> "SELECT id FROM `users`   WHERE (id <= 4) "
>> User.connection.select_value(sql)
#=> "1"
>> User.connection.select_values(sql)
#=> ["1", "2", "3", "4"]


需要说明的是,construct_finder_sql是私有 方法,要使用send。select_value就返回一个。

然后,文主鼓吹,这样写的好处是
1. 使用更少的内存,因为没有创建model
2. 你也可以使用select_rows返回array of arrays
1
0
分享到:
评论
2 楼 sitoto 2012-01-19  
版本的问题

不用那么麻烦了。。

直接 Model.all(options)

暂不管内存
1 楼 hexawing 2011-03-03  
引用
需要说明的是,construct_finder_sql是私有 方法,要使用send。select_value就返回一个。


就这句关键的话没太懂……我试了下报错如下:

sql=User.send(:construct_finder_sql,:select=>'id',:conditions=>["id <= 4"])   
sql=User.send(:construct_finder_sql,:select=>'id',:conditions=>["id <= 4"])   
NoMethodError: undefined method `construct_finder_sql' for #<Class:0x43119c0>
        from D:/RailsFTW/lib/ruby/gems/1.8/gems/activerecord-3.0.4/lib/active_record/base.rb:1008:in `method_missing_without_paginate'
        from D:/RailsFTW/lib/ruby/gems/1.8/gems/will_paginate-2.3.15/lib/will_paginate/finder.rb:170:in `method_missing'
        from (irb):38:in `send'
        from (irb):38

相关推荐

    Ruby on Rails 指南 v5.0.1 中文版

    - **Array的扩展**:列举Array类被扩展后的新方法。 - **Hash的扩展**:展示Hash类的扩展方法。 - **Regexp的扩展**:说明Regexp类的扩展方法。 - **Range的扩展**:列举Range类被扩展后的新方法。 - **Date的扩展**...

    简单介绍Ruby on Rails对PostgreSQL数组类型的支持

    在Rails中创建数组类型的字段,可以在迁移(migration)文件中通过`:array =&gt; true`选项来实现。例如,以下代码创建了一个名为`table_with_arrays`的表,其中包含两个整数数组列`int_array`和`int_array_length`,以及...

    jb:用于Ruby on Rails的简单快速的JSON API模板引擎

    b 一个更简单,更快速的Jbuilder替代方案。 安装 ....jb模板应包含Ruby代码,该代码将返回任何to_json (通常为Hash或Array)的Ruby对象。 然后,返回值将to_json修改为JSON字符串。 例子 # app/vi

    searchable:在Tango Source上进行代码培训实践的Rails应用-Search source code

    我们需要能够使用字符串查询来搜索用户和地址,该查询将从数据库中返回该字符串恰好在哪里的所有匹配记录,例如,如果我在用户中搜索“ anelle”,则我希望所有匹配记录是否都在字符串上用户的名字,姓氏,昵称,...

    Ruby的迭代之道:each与map的较量

    6. **Ruby on Rails**:一个流行的 Web 开发框架,用于构建数据库驱动的 Web 应用。 Ruby 广泛应用于 Web 开发、脚本编写、自动化任务等领域。其优雅的语法和强大的功能使其备受开发者青睐。 #### 迭代方法:`each...

    史上最全开发速查表

    - **数据库操作**:连接 MySQL 数据库,执行 SQL 查询。 #### 其他技术 - **CakePHP**:基于 PHP 的 MVC 框架。 - **Django**:基于 Python 的 MVC 框架。 - **Dojo**:JavaScript 库,提供丰富的用户界面组件。 -...

    享受将SQL注入RubyonRails应用程序的乐趣吧!___下载.zip

    9. **使用防止SQL注入的库**:例如,可以使用`ActiveRecord::Sanitization`模块的`sanitize_sql_array`或`sanitize_sql_for_conditions`方法。 通过了解和应用这些实践,开发者可以在开发Ruby on Rails应用时有效...

    Ruby-Ruby技巧惯用Ruby重构和最佳实践

    例如,`array.each { |item| puts item }`用于打印数组的所有元素。 2. 魔术方法:Ruby允许定义“魔术方法”,如`initialize`(初始化对象)、`to_s`(转化为字符串)和`==`(比较操作)。这些方法可以增强类的行为...

    Ruby语言教程.docx

    - **表达式:** Ruby几乎每条语句都可以视为表达式,返回一个值。 - **集合:** 包括数组(Array)和哈希(Hash)等数据结构。 - **控制结构:** 如条件语句(if/elsif/else)和循环(for/while)等。 - **面向对象编程:** ...

    crystal_on_steroids:使Crystal对程序员更加友好的一组方法(摘自Rails ActiveSupport,Powerpack等)

    在处理数据库查询结果时,`compact`和`slice`方法能帮助快速整理数据结构。 四、提高开发效率与团队协作 引入"crystal_on_steroids"不仅能够提升个人的编程效率,还能提高团队间的代码一致性。当整个团队都使用这...

    parametric:Ruby应用程序的声明式输入模式

    或者可以替代Rails的强参数(它不依赖于Rails,可以独立使用)。 架构图 定义架构 schema = Parametric :: Schema . new do field ( :title ) . type ( :string ) . present field ( :status ) . options ( [ ...

    ruby中文文档

    6. **数组(Array)和哈希(Hash)**:Ruby提供了强大的数组和哈希数据结构,支持多种操作,如迭代、查找、排序等。 7. **异常处理**:Ruby的异常处理使用begin..rescue..else..ensure结构,允许开发者优雅地处理...

    Ruby语言入门教程

    Proc和Lambda是代码块的两种表示形式,它们可以被赋值给变量,作为参数传递或返回。 4. **闭包**:Proc和Lambda是闭包,能捕获定义时的局部变量,即使在定义的上下文之外也能访问。 5. **元编程**:Ruby允许在运行...

    ruby语言

    11. **Rails框架**:Ruby on Rails是基于Ruby构建的一个开源Web应用程序框架,遵循MVC(Model-View-Controller)架构模式,大大简化了Web应用的开发过程。 通过深入学习Ruby语言,你可以掌握一种高效且富有表达力的...

    Ruby的语法和语言特性总结

    散列表的键可以是任何类型,包括符号(如`stuff = {:array =&gt; [1, 2, 3], :string =&gt; 'Hi, mom!'}`)。通过键可以访问对应的值,如`stuff[:string]`返回`"Hi, mom!"`。散列表在Ruby中广泛用于数据存储和查找。 总的...

    ruby基础学习资料

    - Lambda类似Proc,但更严格,如在返回时不会自动返回上级作用域。 7. **异常处理**: 使用`begin/rescue/ensure/finally`处理运行时错误,确保程序的健壮性。 8. **符号(Symbol)**: 符号是不可变的,代表...

    最新Prototype手册

    同时,由于其与Rails框架的紧密集成,常被用于Ruby on Rails项目中。 五、学习资源与社区 学习Prototype.js,可以参考官方文档,查阅各种教程和示例代码,同时,Stack Overflow 和其他开发者论坛是获取帮助和分享...

    中科院高级软件工程期末题库

    **collect**:也称为`map`,用于遍历集合并返回一个新的数组,新数组中的元素是原数组中元素经过指定操作后的结果。例如: ```ruby arr = [1, 2, 3] new_arr = arr.collect { |x| x * 2 } # new_arr 的值为 [2, 4, 6...

    Ruby语言中文教程

    - **数据类型**:Ruby是动态类型语言,主要的数据类型包括字符串(String)、整数(Integer)、浮点数(Float)、布尔值(Boolean)、数组(Array)、哈希(Hash)等。 - **方法**:Ruby中的函数被称为方法,可以定义在类或...

Global site tag (gtag.js) - Google Analytics