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

将SQL查询转换为ActiveRecord并呈现为表,sql,ruby-on-rails,ruby,postgresql,activerecord,Sql,Ruby On Rails,Ruby,Postgresql,Activerecord,我正在尝试将模型中的原始SQL查询转换为使用ActiveRecord查询接口。我认为我正确地翻译了查询,但我无法将其转换为数组来渲染它 这是我的模型: class Pgdb < ActiveRecord::Base self.abstract_class = true self.table_name = 'test' if Rails.env.development? establish_connection :pg_development end def

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

这是我的模型:

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
正如上面的代码所示,我正在访问一个外部PostgreSQL数据库,并尝试使用
#to_a
将ActiveRecord对象转换为数组,但这不起作用。当我尝试在视图中渲染时:

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

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

# 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
这将在数据库中创建一个
pets
表和一个
Pet
类。请注意,表格名称为复数,型号名称为单数

# app/models/pet.rb
class Pet < ActiveRecord::Base

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

Pet.all
Pet.find(1) # find pet where id is 1
# ... etc
pet = Pet.create(name: "Spot")
所有这一切都包含在大部分内容中

没有模型的连接。 虽然如果您不是实际使用每个表的模型,并且在某种程度上遵循MVC约定,那么使用ActiveRecord就没有意义。这是可能的,但它根本没有给你带来任何真正的好处

同样地,在没有MVC的情况下运行Rails也是可行的,但这有什么意义呢

使用遗留数据库 假设您有一个遗留数据库,作者认为使用Apps Hungarian作为数据库列(耸肩)很酷:

persons:
  intPersonID: Integer, Autoincrement, Primary Key 
您希望将其映射到Rails模型

 class User < ActiveRecord::Base
   self.table_name 'persons'
   self.primary_key 'intPersonID'
 end
class用户
或者在您的情况下:

class Test < ActiveRecord::Base
  self.table_name 'test' # since it's not "tests"
end

Test.where(city: "New York")
类测试
对于
Pgdb
的实例,您收到了错误
未定义的方法'each'
,因为您的代码试图在此行中迭代实例的数据属性:

<% row.each do |element| %>
但你不能这样做:

p.each { |attribute| puts attribute }
然而,ActiveRecord为这件事提供了访问器。
attributes
方法返回一个散列,您可以使用
每个方法迭代该散列。因此,您可以这样做:

p = Pgdb.first
p.city # because the underlying table has a `city` attribute
在您的视图中,可以使用以下内容替换内循环:

<% row.attributes.each do |key, value| %>
  <td><%= "#{key}: #{value}" %></td>
<% end %>
无论您是否在
getInfo
中使用
创建一个
,这都会起作用。有很好的理由不将结果集强制转换为数组。首先,
ActiveRecord::Relation
对象还具有其他功能,比如作用域,您可能经常需要使用这些功能


希望有帮助。快乐编码

这毫无意义。为什么要创建名为
Pgdb
的模型?Rails模型是应该反映应用程序中的域对象(如用户、汽车、公司等)而不是数据库连接本身的对象。我有一个需要在AWS上访问的外部数据库。访问此数据库的替代方法是什么?连接工作正常,尽管您的观点可能是正确的,因为它通常是不正确的。您能为呈现此视图的方法包含控制器代码吗?特别是,给@info分配了什么值?@amar47shah-添加了controllermabe因为我的帖子不清楚…我有复杂的外部数据库,不一定特定于我的rails应用程序。我只是使用rails来显示和理解数据库中的信息。我绝对有一个带有外部数据库参数的
config/database.yml
,但实际上如何在模型之外连接到它?我对答案很感兴趣,因为我没有制作过很多rails应用程序,尽管这与我最初提出的呈现ActiveRecord关系的问题没有多大关系。我添加了一个如何在没有模型的情况下连接的示例。
<% row.each do |element| %>
p = Pgdb.first
p.city # because the underlying table has a `city` attribute
p.each { |attribute| puts attribute }
p.attributes.each { |key, value| puts "#{key}: #{value}" }
<% row.attributes.each do |key, value| %>
  <td><%= "#{key}: #{value}" %></td>
<% end %>
<% @info.each do |row| %>