Definiujemy sobie modele dla wszystkich klas w bazie:
ActiveRecord::Base.connection.tables.each do |table|
Object.const_set table.camelize, Class.new(ActiveRecord::Base) { self.table_name = table }
end
Baza zawiera niekoszerne nazwy tabel, więc trzeba je podać explicite. Wszystko fajnie. Załóżmy jednak, że chciałbym sobie w klasach zdefiniować coś więcej, w związku z czym chcę dla przejrzystości zmienić strukturę bloku na do…end. Pytanie brzmi, dlaczego w tym przypadku potrzebne są już nawiasy? Mogę to zrobić na dwa sposoby:
[code=Ruby]ActiveRecord::Base.connection.tables.each do |table|
Object.const_set table.camelize, (Class.new(ActiveRecord::Base) do
self.table_name = table
end)
end
ActiveRecord::Base.connection.tables.each do |table|
Object.const_set(table.camelize, Class.new(ActiveRecord::Base) do
self.table_name = table
end)
end[/code]
Efekt jest taki, że wygląda to mało fajnie i w zasadzie lepiej już chyba zostawić deklarację w oryginalnej formie { }, tylko rozłożyć na kilka linii. Z czego wynika ten problem? Bez nawiasów klasa nadal jest definiowana, ale blok nie jest wykonywany. Zakładam, że block do … end zostaje po prostu przekazany do Object.const_get, gdzie jest ignorowany. Czy do…end ma z definicji inny priorytet niż { }?