I want to do a SQL query, but I haven't created a model. For example, instead of Car.find(:all) I want to be able to use SELECT * from cars. I don't have a Car model because this DB was not created with Rails (it's from a PHP project).
I don't know, if that's the best way to do it, since I nearly never had to use it that way. For most cases Model.find_by_sql was enough, but that requires at least a very basic model.
But you can run plain SQL like this:
@foo = ActiveRecord::Base::connection.execute("SELECT ALL * FROM cars") and then @foo.each will give you all the data.
@foo is of class Mysql::Result I don't know, what the methods are that this class has, but @foo.methods will give you a list and maybe you can find something useful
I don't know, if that's the best way to do it, since I nearly never had to use it that way. For most cases Model.find_by_sql was enough, but that requires at least a very basic model.
But you can run plain SQL like this:
@foo = ActiveRecord::Base::connection.execute("SELECT ALL * FROM cars") and then @foo.each will give you all the data.
@foo is of class Mysql::Result
if you use select_all then you get an array of hashes which is probably easier to play with.
Fred
John Smith wrote:
I want to do a SQL query, but I haven't created a model. For example, instead of Car.find(:all) I want to be able to use SELECT * from cars. I don't have a Car model because this DB was not created with Rails (it's from a PHP project).
Also I want to use a different database when I use this SQL queries. I mean, is a Ruby app, but uses this SQL queries to access to a different database.
I do this in a rails app of mine. I just set up regular ruby classes to handle it (not inherited from Active Record). Just because you're using rails doesn't mean you always have to use Active Record.
class Crm < ActiveRecord::Base end class Connection1 < Crm self.establish_connection(:adapter => "mysql",:username => 'blah', :password => 'badpassword',:host=>'localhost',:database=>'test_development') end class Connection2 < Crm self.establish_connection(:adapter => "mysql",:username => 'blah', :password => 'badpassword',:host=>'localhost',:database=>'test_development') end
def self.method_missing(method,*args) if Crm::ALL.include? method.to_s.classify eval(method.to_s.classify) else super end end
puts Crm.send(:connection1).find_by_sql("blah") puts Crm.send(:connection2).find_by_sql("blah")
You can have as many "connections" as you like. Depending on file placement, you may need to preload the top CRM class as rails is loading.
John Smith wrote:
David Harkness wrote:
So I only need to create this class, into the model folder, isn't it? Thanks, I will try it.