2008-09-17 13 views
3

İşte durum., farklı bir veritabanında doğrudan SQL kodunu nasıl çalıştırırım?

Bazı belirli veritabanlarında veri kalitesini izleyecek bir Rails uygulaması yazıyorum. Bunu yapmak için, bu veritabanları üzerinden doğrudan SQL sorguları yürütebilmem gerekir - ki bu da Rails uygulama modellerini sürmek için kullanılanla aynı değildir. Kısacası, bu ActiveRecord temel bağlantısından geçmenin hilesini kullanamayacağım anlamına gelir.

Bağlanmam gereken veritabanları, tasarım zamanında bilinmemektedir (yani: database.yaml dosyasında ayrıntılarını ekleyemiyorum). Daha ziyade, kullanıcının uygulamada sorguları yürüteceği veritabanlarının ayrıntılarını girmek için kullanacağı bir 'database_details' modelim var.
Bu nedenle, bu veritabanlarına bağlantı gerçekten dinamiktir ve ayrıntılar yalnızca çalışma zamanında çözülür.

Bunu nasıl yapabilirim?

sayesinde
Rollo

cevap

6

Bir dış uygulamanın yüzlerce farklı örneğine bağlanmak zorunda olduğum bir durum vardı ve aşağıdakine benzer bir kod yaptım:

def get_custom_connection(identifier, host, port, dbname, dbuser, password) 
     eval("Custom_#{identifier} = Class::new(ActiveRecord::Base)") 
     eval("Custom_#{identifier}.establish_connection(:adapter=>'mysql', :host=>'#{host}', :port=>#{port}, :database=>'#{dbname}', " + 
     ":username=>'#{dbuser}', :password=>'#{password}')") 
    return eval("Custom_#{identifier}.connection") 
    end 

Modellerinizin devraldığı ActiveRecord :: Base bağlantınızı değiştirmemenin ek yararı vardır, bu nedenle SQL'i bu bağlantıya karşı çalıştırabilir ve işiniz bittiğinde nesneyi atabilirsiniz.

+0

içine bakacağız, yaklaşım o zaman sahip olduğum problem için daha uygundur. Paylaşım için çok teşekkürler! –

0

Eğer yerini alabilir Gördüğünüz gibi programlı bu

ActiveRecord::Base.establish_connection(
    :adapter => "mysql", 
    :host  => "localhost", 
    :username => "myuser", 
    :password => "mypass", 
    :database => "somedatabase" 
) 

böyle bir telefon kullanarak bağlantı kurabilir Sen self.establish_connection

+0

Hello Mat, Aslında, veritabanı.yaml içinde uzak veritabanını '' kodlamak '' zorunda kaldığınız için bunu yapmazsınız ve mayınlar dinamiktir, yani bağlantı detaylarını çalışma zamanında çözerek bunlara bağlanmak zorunda olduğum anlamına gelir. model kendisi. Sorunu daha net hale getirmek için güncelleyeceğim! Teşekkürler –

9

aracılığıyla bunu yapmak mümkün olabilir somedatabase veritabanı_model.database_name değeriyle. adatpter ile aynı ve tüm

ActiveRecord::Base.establish_connection documentation

Sonra

ActiveRecord::Base.find_by_sql("select * ") 

sizin sql sorgusu çalıştırmak için kullanabilirsiniz. Eğer :) bittiğinde

Mr Matt

ActiveRecord::Base.find_by_sql documentation (hala tasarım yaklaşımı için yararlı modası geçmiş ama) here bulundu ve normal veritabanına bağlanmayı unutmayın edilebilir eksik

fazla bilgi doğru ise oldu

+0

Teşekkürler! Ben tüm bu –

İlgili konular