gpt4 book ai didi

sql - 将 SQL 查询转换为 ActiveRecord 并呈现为表

转载 作者:数据小太阳 更新时间:2023-10-29 07:59:18 25 4
gpt4 key购买 nike

我正在尝试将模型中的原始 SQL 查询转换为使用 ActiveRecord 查询接口(interface)。我认为我正确翻译了查询,但我无法将其转换为数组来呈现它。

这是我的模型:

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 查询是:

get = connection.query("SELECT * FROM test WHERE city = "New York")

如上代码所示,我正在访问外部 PostgreSQL 数据库并尝试使用 #to_a 将 ActiveRecord 对象转换为数组。但这不起作用。当我尝试在我的 View 中呈现它时:

<% @info.each do |row| %>
<tr>
<% row.each do |element| %>
<td><%= element %></td>
<% end %>
</tr>
<% end %>

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

Controller

def index
end

def new
@thing = Thing.new
end

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

最佳答案

您收到错误 undefined method 'each' for an instance of Pgdb 因为您的代码试图迭代此行中实例的数据属性:

<% row.each do |element| %>

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

p = Pgdb.first
p.city # because the underlying table has a `city` attribute

但是你不能这样做:

p.each { |attribute| puts attribute }

但是,ActiveRecord 提供了 attributes就是这个东西的访问器。 attributes 方法返回一个散列,您可以使用 each 方法对其进行迭代。因此,您可以这样做:

p.attributes.each { |key, value| puts "#{key}: #{value}" }

在您看来,您可以将内部循环替换为:

<% row.attributes.each do |key, value| %>
<td><%= "#{key}: #{value}" %></td>
<% end %>

这应该为您的 Pgdb 实例呈现属性。

顺便说一句,在Pgdb::getInfo 中,不必将where 的结果转换为Arraywhere 查询返回一个 ActiveRecord::Relation 对象,该对象响应 each,以及其他 Enumerable 消息,例如mapselect,类似于数组。在您的代码中,您成功地迭代了

中的结果集
<% @info.each do |row| %>

无论您是否在 getInfo 中使用 to_a,这都会起作用。有充分的理由将结果集转换为数组。其一,ActiveRecord::Relation 对象具有其他功能,例如您可能经常需要使用的作用域。

希望对您有所帮助。编码愉快!

关于sql - 将 SQL 查询转换为 ActiveRecord 并呈现为表,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/31777824/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com