ACHTUNG. Das ist ein Archiv des alten forum.ruby-portal.de. Die aktuelle Mailingliste gibt es auf lists.ruby-lang.org/pipermail/ruby-de.

NOTICE. This is a ready-only copy of the old forum.ruby-portal.de. You can find the current mailing list at lists.ruby-lang.org/pipermail/ruby-de.

Die Programmiersprache Ruby

Blog|

Forum|

Wiki  


Alle Zeiten sind UTC + 1 Stunde [ Sommerzeit ]

Ein neues Thema erstellen Auf das Thema antworten  [ 7 Beiträge ] 
Autor Nachricht
BeitragVerfasst: 10 Dez 2015, 15:52 
Offline
Schüler
Benutzeravatar

Registriert: 14 Okt 2014, 16:36
Beiträge: 24
Wohnort: Hessen
Ich schreibe ein Plugin für Redmine mit Rails 3.2. Ich habe einen ActiveRecord dessen Daten in einer externen Datenbank liegen. Ich habe für diesen die Methode establish_connection überschrieben.


1
2
3
4
5
6
7
8
9
10
11
12
13
14
15

...
establish_connection(
:adapter => Setting.plugin_users['db_adapter'],
:host => Setting.plugin_users['db_host'],
:user => Setting.plugin_users['db_user'],
:password => Setting.plugin_users['db_password'],
:database => Setting.plugin_users['db_database'],
:port => Setting.plugin_users['db_port']
)

self.table_name='users'

self.primary_key='user'
...


Abfrage in Controller die fehlschlägt:


1
2
3
4

...
@users=User.where('created_at >= ?', time.to_datetime)
...


Allerdings versucht er bei einer Abfrage mit 'where' über die Default Einstellungen eine Connection zu erzeugen. Weiß zufällig jemand Rat ob weitere Teile von dem ActiveRecord zu überschreiben sind, oder was sonst unternommen werden kann damit er immer die Verbindung über die Gewünschten Werte einrichtet?


Zuletzt geändert von Quintus am 11 Dez 2015, 12:33, insgesamt 1-mal geändert.
Titel angepasst, sodass man erkennt, dass es nicht um reines Rails, sondern um Redmine geht


Nach oben
 Profil  
 
BeitragVerfasst: 10 Dez 2015, 18:02 
Offline
Lehrling
Benutzeravatar

Registriert: 28 Feb 2012, 21:58
Beiträge: 86
Wohnort: NRW
Hallo,

also ich habe selber noch nicht so viel mit Activerecord gearbeitet aber im Grunde sollte es doch so klappen das du in der database.yml einfach die externe DB-parameters anlegst und dann mit Hilfe von einer Klasse (bei mir jetzt Example)


establish_connection :database_name 
überschreibst. Damit sollte doch eigentlich dein Problem mit dem verwenden einer weiteren externen Datenbank zu lösen sein.

Also ungefähr so:

database.yml


1
2
3
4
5
6
7
8
9
10
11
default: &default
adapter: sqlite3
pool: 5
timeout: 5000

#Zweite datenbank verbindung
Super_externe_db:
adapter: postgresql
username: root
password: hallo_welt
database: example_externe_db

Ruby-class:


1
2
3
4

class Example < ActiveRecord::Base
establish_connection :Super_externe_db
end


weiß aber nicht genau ob das so rennt. Oder ob dir das weiter hilft :/

mfg Manchotix


Nach oben
 Profil  
 
BeitragVerfasst: 11 Dez 2015, 11:52 
Offline
Schüler
Benutzeravatar

Registriert: 14 Okt 2014, 16:36
Beiträge: 24
Wohnort: Hessen
Danke. Allerdings tue ich ja im Grunde in meinem Code nichts anderes als du mit deinem Eintrag in database.yml, nur das ich die Settings meines Plugins zum einrichten der Verbindung nutze. Mir ist allerdings aufgefallen, dass in dem Fall der 'where'-Abfrage die Default-Werte der Settings nutzt. Also wäre es schon eher eine Redmine spezifische Frage. Ich habe mir einfach im Controller die Settings ausgeben lassen, dort werden die eingetragenen Werte korrekt wiedergegeben. Ich bin kein Ruby-Experte. Kann es sein das where statisch ist und establish_connection nur für Objekte umgesetzt wird?


Nach oben
 Profil  
 
BeitragVerfasst: 11 Dez 2015, 14:17 
Offline
Lehrling
Benutzeravatar

Registriert: 28 Feb 2012, 21:58
Beiträge: 86
Wohnort: NRW
Es wäre denke ich mal leichter dir zu helfen wenn du hier oder auf Pastebin denn Code uns zeigen könntest und was für ein Output oder Fehlermeldung beim Ausführen entsteht.

Weil im Grunde hat das ja nichts mehr großartig mit Redmine zu tun, also würde ich sagen, da ja so gut wie nur ActiveRecord von Rails verwendet wird um mit der Datenbank zu arbeiten.

Und vielleicht solltest du deine Subclass nicht User nennen weil Redmine das ja schon selber verwendet.
spellsleeper hat geschrieben:
Kann es sein das where statisch ist und establish_connection nur für Objekte umgesetzt wird?

Zum einen ja #where ist eine Statischemethode soweit ich weiß aber sollte die Verbindungen verwenden die du deiner Subclass gegeben hast.

VG Manchotix


Nach oben
 Profil  
 
BeitragVerfasst: 11 Dez 2015, 15:11 
Offline
Schüler
Benutzeravatar

Registriert: 14 Okt 2014, 16:36
Beiträge: 24
Wohnort: Hessen
Fehlerausgabe:


1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25

Mysql2::Error (Access denied for user 'root'@'192.168.1.38' (using password: YES)):
mysql2-0.3.20-x86 (mingw32) lib/mysql2/client.rb:70:in `connect'
mysql2-0.3.20-x86 (mingw32) lib/mysql2/client.rb:70:in `initialize'
activerecord (3.2.21) lib/active_record/connection_adapters/mysql2_adapter.rb:16:in `new'
activerecord (3.2.21) lib/active_record/connection_adapters/mysql2_adapter.rb:16:in `mysql2_connection'
activerecord (3.2.21) lib/active_record/connection_adapters/abstract/connection_pool.rb:315:in `new_connection'
activerecord (3.2.21) lib/active_record/connection_adapters/abstract/connection_pool.rb:325:in `checkout_new_connection'
activerecord (3.2.21) lib/active_record/connection_adapters/abstract/connection_pool.rb:247:in `block (2 levels) in checkout'
activerecord (3.2.21) lib/active_record/connection_adapters/abstract/connection_pool.rb:242:in `loop'
activerecord (3.2.21) lib/active_record/connection_adapters/abstract/connection_pool.rb:242:in `block in checkout'
C:/Ruby/lib/ruby/1.9.1/monitor.rb:211:in `mon_synchronize'
activerecord (3.2.21) lib/active_record/connection_adapters/abstract/connection_pool.rb:239:in `checkout'
activerecord (3.2.21) lib/active_record/connection_adapters/abstract/connection_pool.rb:102:in `block in connection'
C:/Ruby/lib/ruby/1.9.1/monitor.rb:211:in `mon_synchronize'
activerecord (3.2.21) lib/active_record/connection_adapters/abstract/connection_pool.rb:101:in `connection'
activerecord (3.2.21) lib/active_record/connection_adapters/abstract/connection_pool.rb:410:in `retrieve_connection'
activerecord (3.2.21) lib/active_record/connection_adapters/abstract/connection_specification.rb:171:in `retrieve_connection'
activerecord (3.2.21) lib/active_record/connection_adapters/abstract/connection_specification.rb:145:in `connection'
activerecord (3.2.21) lib/active_record/sanitization.rb:130:in `replace_bind_variables'
activerecord (3.2.21) lib/active_record/sanitization.rb:117:in `sanitize_sql_array'
activerecord (3.2.21) lib/active_record/sanitization.rb:28:in `sanitize_sql_for_conditions'
activerecord (3.2.21) lib/active_record/relation/query_methods.rb:324:in `build_where'
activerecord (3.2.21) lib/active_record/relation/query_methods.rb:136:in `where'
C:in `where'

(Falscher Username, falsche IP)

Hier wird der Fehler geworfen:


1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23

class UsersController < ApplicationController




def index
@users=getActiveUsers
end


def save
@user=User.new
end

private

def getActiveUsers
time=30.days.ago.beginning_of_day
@users=User.where('created_at >= ?', time.to_datetime) #<-Fehlerstelle
end

end


Übrigens sind es gar nicht die Default-Werte der Redmine-Settings, der MySQL Adapter muß noch irgendwie, trotz der überschriebenen establish_connection-Methode, versuchen auf die in Redmine standartmäßig eingetragene Datenbank zuzugreifen.

PS. Das Model und auch der Controller heißen nicht wirklich 'User/s'-habe den realen Namen damit ersetzt.


Nach oben
 Profil  
 
BeitragVerfasst: 11 Dez 2015, 15:44 
Offline
Schüler
Benutzeravatar

Registriert: 14 Okt 2014, 16:36
Beiträge: 24
Wohnort: Hessen
Zitat:
Habe den Fehler vermutlich gefunden. Die establish_connection-Methode musste vor der statischen Abfrage einmal ausgeführt werden. Also:


1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20

class UsersController < ApplicationController

def index
User.establish_connection #!!!
@users=getActiveUsers
end

def save
@user=User.new
end

private

def getActiveUsers
time=30.days.ago.beginning_of_day
@users=User.where('created_at >= ?', time.to_datetime) #<-Fehlerstelle
end

end


Trotzdem nochmal vielen Dank an Manchotix!


Leider war dies dann doch nicht des Rätsels Lösung, bei der nächsten Gelegenheit im View hat die User-Abfrage wieder die Standart-Redmine DB genutzt. Wo er natürlich keine Daten gefunden hat. Was mich wieder zu der Frage bringt, wie kann ich einen ActiveRecord dauerhaft auf eine externe Datenquelle festlegen. Bin für jede Hilfe dankbar.


Nach oben
 Profil  
 
BeitragVerfasst: 18 Dez 2015, 12:04 
Offline
Schüler
Benutzeravatar

Registriert: 14 Okt 2014, 16:36
Beiträge: 24
Wohnort: Hessen
Für alle die gleiche Probleme haben kann ich folgende Seite empfehlen http://ilikestuffblog.com/2012/09/21/establishing-a-connection-to-a-non-default-database-in-rails-3-2-2/


Nach oben
 Profil  
 
Beiträge der letzten Zeit anzeigen:  Sortiere nach  
Ein neues Thema erstellen Auf das Thema antworten  [ 7 Beiträge ] 

Alle Zeiten sind UTC + 1 Stunde [ Sommerzeit ]


Wer ist online?

Mitglieder in diesem Forum: 0 Mitglieder und 6 Gäste


Du darfst keine neuen Themen in diesem Forum erstellen.
Du darfst keine Antworten zu Themen in diesem Forum erstellen.
Du darfst deine Beiträge in diesem Forum nicht ändern.
Du darfst deine Beiträge in diesem Forum nicht löschen.
Du darfst keine Dateianhänge in diesem Forum erstellen.

Suche nach: