Rails 3 exécute une requête SQL personnalisée sans modèle

Je dois écrire un script Ruby autonome qui est censé traiter la firebase database. J’ai utilisé le code ci-dessous dans les rails 3

@connection = ActiveRecord::Base.establish_connection( :adapter => "mysql2", :host => "localhost", :database => "siteconfig_development", :username => "root", :password => "root123" ) results = @connection.execute("select * from users") results.each do |row| puts row[0] end 

mais obtenir une erreur: –

 `': undefined method `execute' for # (NoMethodError) 

qu’est-ce qui me manque ici?

SOLUTION

Après avoir obtenu la solution de denis-bu, je l’ai utilisée de la manière suivante et cela a également fonctionné.

 @connection = ActiveRecord::Base.establish_connection( :adapter => "mysql2", :host => "localhost", :database => "siteconfig_development", :username => "root", :password => "root123" ) sql = "SELECT * from users" @result = @connection.connection.execute(sql); @result.each(:as => :hash) do |row| puts row["email"] end 

Peut-être essayer ceci:

 ActiveRecord::Base.establish_connection(...) ActiveRecord::Base.connection.execute(...) 
 connection = ActiveRecord::Base.connection connection.execute("SQL query") 

Je recommande d’utiliser ActiveRecord::Base.connection.exec_query au lieu d’ ActiveRecord::Base.connection.execute qui retourne un ActiveRecord::Result (disponible dans rails 3.1+), ce qui est un peu plus facile à utiliser.

Ensuite, vous pouvez y accéder de diverses manières, comme le .rows , le .each ou le .to_hash

De la documentation :

 result = ActiveRecord::Base.connection.exec_query('SELECT id, title, body FROM posts') result # => # # Get the column names of the result: result.columns # => ["id", "title", "body"] # Get the record values of the result: result.rows # => [[1, "title_1", "body_1"], [2, "title_2", "body_2"], ... ] # Get an array of hashes representing the result (column => value): result.to_hash # => [{"id" => 1, "title" => "title_1", "body" => "body_1"}, {"id" => 2, "title" => "title_2", "body" => "body_2"}, ... ] # ActiveRecord::Result also includes Enumerable. result.each do |row| puts row['title'] + " " + row['body'] end 

note: copié ma réponse d’ ici

Vous pouvez également utiliser find_by_sql

 # A simple SQL query spanning multiple tables Post.find_by_sql "SELECT p.title, c.author FROM posts p, comments c WHERE p.id = c.post_id" > [#"Ruby Meetup", "first_name"=>"Quentin"}>, ...] 

Que dis-tu de ça :

 @client = TinyTds::Client.new( :adapter => 'mysql2', :host => 'host', :database => 'siteconfig_development', :username => 'username', :password => 'password' sql = "SELECT * FROM users" result = @client.execute(sql) results.each do |row| puts row[0] end 

TinyTds gem doit être installé, car vous ne l’avez pas spécifié dans votre question, je n’ai pas utilisé Active Record