首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
社区首页 >问答首页 >将SQL查询转换为ActiveRecord并将其呈现为表

将SQL查询转换为ActiveRecord并将其呈现为表
EN

Stack Overflow用户
提问于 2015-08-02 16:03:30
回答 2查看 652关注 0票数 3

我正在尝试将模型中的原始SQL查询转换为使用ActiveRecord查询接口。我认为我正确地翻译了这个查询,但是我不能将它转换成一个数组来呈现它。

这是我的模型:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
class Pgdb < ActiveRecord::Base

  self.abstract_class = true
  self.table_name = 'test'

  if Rails.env.development?
    establish_connection :pg_development
  end

  def self.getInfo(name)
    get = Pgdb.where(city: "New York")
    get_a = get.to_a
    get_a
  end
end

我能够呈现的原始SQL查询是:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
get = connection.query("SELECT * FROM test WHERE city = "New York")

正如上面的代码所示,我正在访问一个外部PostgreSQL数据库,并尝试使用#to_a将ActiveRecord对象转换为数组,但这是行不通的。在我看来,当我试图渲染它时:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
<% @info.each do |row| %>
  <tr>
    <% row.each do |element| %>
      <td><%= element %></td>
    <% end %>
  </tr>
<% end %>

我得到了一个错误:undefined method 'each' for #<Pgdb:0x007fd37af79040>。我尝试过在代码中的不同位置对对象使用to_a,但是没有什么效果。

控制器

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
def index
end

def new
  @thing = Thing.new
end

def create
  @info = Pgdb.getInfo(@thing.something)
  render :index
end
EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2015-08-02 17:06:24

您正在接收Pgdb实例的错误Pgdb,因为您的代码试图迭代此行中实例的数据属性:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
<% row.each do |element| %>

ActiveRecord实例不是可以迭代的属性集合。相反,它们是响应以其属性命名的消息的对象。换句话说,你可以这样做:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
p = Pgdb.first
p.city # because the underlying table has a `city` attribute

但你不能这么做

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
p.each { |attribute| puts attribute }

但是,ActiveRecord为这件事提供了attributes访问器。attributes方法返回可以使用each方法迭代的散列。因此,您可以这样做:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
p.attributes.each { |key, value| puts "#{key}: #{value}" }

在您的视图中,您可以用以下内容替换内部循环:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
<% row.attributes.each do |key, value| %>
  <td><%= "#{key}: #{value}" %></td>
<% end %>

这将呈现Pgdb实例的属性。

顺便说一句,没有必要将where的结果转换为Pgdb::getInfo中的一个Arraywhere查询返回响应eachActiveRecord::Relation对象,以及类似于数组的mapselect等其他Enumerable消息。在您的代码中,您将成功地在

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
<% @info.each do |row| %>

无论您是否在to_a中使用getInfo,这都是可行的。有很好的理由不将结果集转换为数组。首先,ActiveRecord::Relation对象具有其他功能,比如作用域,您可能经常需要使用这些功能。

希望这能有所帮助。编码愉快!

票数 2
EN

Stack Overflow用户

发布于 2015-08-02 16:52:44

将rails连接到外部数据库的正确方法是使用config/database.yml文件:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
# SQLite version 3.x
#   gem install sqlite3
#
#   Ensure the SQLite 3 gem is defined in your Gemfile
#   gem 'sqlite3'
#
defaults: &defaults
  adapter: postgresql
  encoding: utf8
  template: template0

# used for test & development
local:
  host: localhost
  username: j_random_user # change this!
  password: p4ssword # change this!

development:
  <<: *defaults
  <<: *local
  database: my_app_development

# Warning: The database defined as "test" will be erased and
# re-generated from your development database when you run "rake".
# Do not set this db to the same as development or production.
test:
  <<: *defaults
  <<: *local
  database: my_app_test

production:
  <<: *defaults
  host: "my_app_something.rds.amazonaws.com" # change this!
  username: my_amazon_db_user # change this!
  password: my_amazon_user # change this!
  reconnect: true
  port: 3306

您可能希望使用本地postgres数据库进行开发,并将生产数据库镜像为pgbackup。

但是,您的主要问题是,在创建rails应用程序时,您所做的一切都是错误的。这看起来像一个PHP示例,在这个例子中,某个无知的灵魂正在第1000次重新创建数据库管理器。

下面是Rails MVC和ActiveRecord速成课程:

模型反映了您域中的对象。假设我们有宠物商店的应用程序。

当然,我们需要宠物模型:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
$ rails g model Pet name:string
$ rake db:migrate

这将在数据库中创建一个pets表和一个Pet类。注意,表名是复数的,模型名是单数的。

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
# app/models/pet.rb
class Pet < ActiveRecord::Base

end 

然后,我们可以通过以下方式访问宠物:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
Pet.all
Pet.find(1) # find pet where id is 1
# ... etc

我们可以通过以下方式创造宠物:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
pet = Pet.create(name: "Spot")

所有这些都包含在大多数基本rails教程中。

没有模型的连接。

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
ActiveRecord::Base.establish_connection
con = ActiveRecord::Base.connection
res = con.execute('SELECT * FROM foo')

尽管如果您不实际使用每个表的模型并在某种程度上遵循MVC约定,那么使用ActiveRecord实际上就没有意义。这是可能的,但它并没有给你真正的好处。

同样,没有MVC的Rails也是可行的,但有什么意义呢?

使用遗留数据库

假设您有一个遗留数据库,它是由一些人编写的,尽管他们使用Apps匈牙利语作为数据库列(耸耸肩)是很酷的:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
persons:
  intPersonID: Integer, Autoincrement, Primary Key 

你想把它映射到一个Rails模型

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
 class User < ActiveRecord::Base
   self.table_name 'persons'
   self.primary_key 'intPersonID'
 end

或者在你的情况下:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
class Test < ActiveRecord::Base
  self.table_name 'test' # since it's not "tests"
end

Test.where(city: "New York")
票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/31777824

复制
相关文章
面试将横表转换为竖表?
可以看出与要给出的结果一样其中还对会出现空做了判断,当然在真实的面试中还是不要画蛇添足了 5、这样也是可以达到效果的
技术从心
2019/08/06
8100
面试将横表转换为竖表?
将tensor转换为图像_tensor转int
版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 举报,一经查实,本站将立刻删除。
全栈程序员站长
2022/11/07
11.4K0
MySQL 纵表转横表查询实现
INSERT INTO tb_test(attr, attr_value) VALUES('age', 18), ('sex', '男'), ('name', '授客'),('hobby', 'unknow');
授客
2020/09/24
5.1K0
MySQL 纵表转横表查询实现
SQL的单表查询
create database mydb1; Create database mydb2 character set gbk; Create database mydb3 character set gbk COLLATE gbk_chinese_ci;
全栈程序员站长
2021/07/22
2.2K0
SQL三表连接查询
发布者:全栈程序员栈长,转载请注明出处:https://javaforall.cn/135565.html原文链接:https://javaforall.cn
全栈程序员站长
2022/08/18
2.1K0
SQL之单表查询
附上下面要用到的数据库和表的 SQL 语句,在数据库管理页面新建一个查询然后使用 CV 大法转移过去执行即可:
wsuo
2020/07/30
1.8K0
SQL数据查询之——单表查询
一、SQL数据查询的一般格式 数据查询是数据库的核心操作。SQL提供了SELECT语句进行数据查询,其一般格式为: SELECT [ALL | DISTINCT]<目标列表达式>[,<目标列表达式>]··· FROM<表名或视图名>[,<表名或视图名>···] | (SELECT语句>)[AS]<别名> [WHERE<条件表达式>] [GROUP BY<列名1>[HAVING<条件表达式>]] [ORDER BY<列名2>[ASC | DESC]]; 整个SELECT语句的含义是,根据WHERE子句的条件表
Zoctopus
2018/06/04
1.8K0
sql server 连接查询_连表查询语句
连接查询包括合并、内连接、外连接和交叉连接,如果涉及多表查询,了解这些连接的特点很重要。
全栈程序员站长
2022/10/05
3.4K0
SQL数据查询之——单表查询
数据查询是数据库的核心操作。SQL提供了SELECT语句进行数据查询,其一般格式为:
Twcat_tree
2022/11/30
1.7K0
用DBMS_REDEFINITION将普通表转换为分区表
这些方案的思路都是创建一个新的分区表,然后把旧表的数据转移到新表上面,接着转移相应的依赖关系,最后进行表的重命名,把新表和旧表rename。与前三种方案相比,DBMS_REDEFINITION几乎不影响旧表的正常使用,因此也逐渐成为目前普遍使用的转换分区表的方案。
星哥玩云
2022/08/18
4780
JavaScript SheetJS将 Html 表转换为 Excel 文件
在本教程中,我们可以在客户端从我们的 HTML 表数据创建一个 excel 文件。即使用javascript将HTML 表导出到Excel (.xlsx)。
全栈程序员站长
2022/09/09
5.4K0
如何使用Python将图像转换为NumPy数组并将其保存到CSV文件?
Python 是一种功能强大的编程语言,具有大量的库和模块。其中一个库是 NumPy,它用于数值计算和处理大型多维数组和矩阵。另一个用于Python图像处理的流行库是Pillow,它是Python Imaging Library(PIL)的一个分支。
很酷的站长
2023/08/11
4820
如何使用Python将图像转换为NumPy数组并将其保存到CSV文件?
使用导出导入(datapump)方式将普通表切换为分区表
      随着数据库数据量的不断增长,有些表需要由普通的堆表转换为分区表的模式。有几种不同的方法来对此进行操作,诸如导出表数据,然后创建分区表再导入数据到分区表;使用EXCHANGE PARTITION方式来转换为分区表以及使用DBMS_REDEFINITION来在线重定义分区表。本文描述的是使用导出导入方式来实现,下面是具体的操作示例。
Leshami
2018/08/13
9400
【T-SQL基础】01.单表查询-几道sql查询题
概述: 本系列【T-SQL基础】主要是针对T-SQL基础的总结。 本篇主要总结了常见的对单表查询的SQL查询题目。 首先我们必须了解SQL查询的各字句在逻辑上按以下顺序进行处理: 1.FROM 2.W
悟空聊架构
2018/05/18
2K0
sql学习笔记(三)—— 联表查询
既然是联表查询,那肯定得多个表啊,所以,我们先创建一个教师表,表名为 teacher,并且向表中插入数据。
CherishTheYouth
2019/09/11
1.1K0
sql学习笔记(三)—— 联表查询
java map 转string_java-将Map <String,Object>转换为Map <String,String>
Map map = new HashMap(); //Object is containing String
全栈程序员站长
2022/08/25
12.3K0
mybatis中的动态sql表现为_MybatisPlus
Mybatis如何分页查询?Mysql中可以使用limit语句,但limit并不是标准SQL中的,如果是其它的数据库,则需要使用其它语句。MyBatis提供了RowBounds类,用于实现分页查询。RowBounds中有两个数字,offset和limit。
全栈程序员站长
2022/11/09
1.1K0
mybatis中的动态sql表现为_MybatisPlus
ActiveRecord
MybatisPlus支持ActiveRecord形式调用,实体类只需继承Model类即可进行强大的CRUD操作
阿超
2022/08/17
2260
ActiveRecord
SQL92&SQL99实现三表联合查询
–给city表添加测试数据 insert into city values(1,‘商丘’,‘历史闻名古都’); insert into city values(2,‘邯郸’,‘历史闻名古都’); insert into city values(3,‘洛阳’,‘历史闻名古都’); insert into city values(4,‘开封’,‘历史闻名古都’); –将部门表中的loc字段设置为城市表的城市编号 update dept set loc=‘1’ where deptno=50; update dept set loc=‘2’ where deptno=40; update dept set loc=‘3’ where deptno=30; update dept set loc=‘4’ where deptno=20; update dept set loc=‘4’ where deptno=10; –完成三表联合查询 –SQL92实现:查询员工信息及部门名称及所在城市名称并且员工的工资大于2000或者有奖金 –特点:易于书写,难于阅读 –缺点:92的SQL语句结构不清晰 –用法: –select 内容 (别名,连接符,去除重复,oracle函数,逻辑运算) –from 表名1,表名2,表名3… –where 条件(连接条件,普通筛选条件,where子句关键字) –group by 分组字段 –having 多行函数筛选 –order by 排序字段 select e.*,d.dname,c.cname from emp e,dept d,city c where (e.deptno=d.deptno and d.loc=c.cid and sal>2000) or (e.deptno=d.deptno and d.loc=c.cid and comm is not null) order by e.sal –SQL99实现:查询员工信息及部门名称及所在城市名称并且员工的工资大于2000或者有奖金 –特点:难于书写,易于阅读 –使用: –select 内容 from 表名1 – inner join 表名2 – on 连接条件 –inner join 表名3 –on 连接条件 –where 普通筛选条件 –group by 分组 –having 多行函数筛选 –order by 排序 select * from emp e inner join dept d on e.deptno = d.deptno inner join city c on d.loc =c.cid where e.sal>2000 or e.comm is not null order by e.sal
葆宁
2019/04/19
1.2K0
SQL92&SQL99实现三表联合查询
点击加载更多

相似问题

将SQL查询转换为ActiveRecord查询

14

将SQL查询转换为Activerecord查询

110

将ActiveRecord查询转换为sql

13

将SQL转换为ActiveRecord查询

14

将sql查询转换为activerecord

10
添加站长 进交流群

领取专属 10元无门槛券

AI混元助手 在线答疑

扫码加入开发者社群
关注 腾讯云开发者公众号

洞察 腾讯核心技术

剖析业界实践案例

扫码关注腾讯云开发者公众号
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档
查看详情【社区公告】 技术创作特训营有奖征文