将SQL查询转换为ActiveRecord并呈现为表
我正在尝试将模型中的原始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
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| %>