Hi to all,
seems that Globalize creates wrong sql statements on dinamic finders on
translated columns (find_by_{attribute}) when locale is not en-US.
Globalize Plugin (for_1_2) installed on vendor/plugins under application
root
Rails 1.2.3
Ruby 1.8.6
Mysql Ver 14.12 Distrib 5.0.37, for redhat-linux-gnu (i686) using
readline 5.0
Fedora Core 7
Example:
Migration / Table:
db/migrate/001_test1.rb
class Test1 < ActiveRecord::Migration
def self.up
create_table(:test1s, :options => ''DEFAULT
CHARSET=UTF8'') do |t|
t.column :name, :string, :limit => 100, :null => false
t.column :description, :string, :limit => 100, :null => false
t.column :created_at, :datetime, :null => false
t.column :updated_at, :datetime, :null => false
end
end
def self.down
drop_table :test1s
end
end
Model:
app/models/test1.rb
class Test1 < ActiveRecord::Base
translates :description
validates_presence_of :name, :description
validates_uniqueness_of :name, :description
end
Configuration:
config/environment.rb
... on last line...
Globalize::Locale.set_base_language "en-US"
Now running script/console
t=Test1.new
=> #<Test1:0xb76b1bf8 @attributes={"name"=>"",
"updated_at"=>nil,
"description"=>"", "created_at"=>nil},
@new_record=true>
t.name="n1"
=> "n1"
t.description="d1"
=> "d1"
t.save!
=> true
Globalize::Locale.set "en-US"
=> #<Globalize::Locale:0xb769db08 @currency_decimal_sep=".",
@currency_format=nil, @decimal_sep=".", @language=English,
@code="en-US", @date_format=nil, @thousands_sep=",",
@country=#<Globalize::Country:0xb76999e0
@attributes={"date_format"=>nil,
"currency_decimal_sep"=>".",
"thousands_sep"=>",",
"code"=>"US",
"number_grouping_scheme"=>"western",
"english_name"=>"United States of America",
"decimal_sep"=>".",
"id"=>"223",
"currency_code"=>"USD",
"currency_format"=>nil}>,
@number_grouping_scheme=:western, @currency_code="USD">
Test1.find_by_description("d1")
=> #<Test1:0xb76943b4 @original_language=English,
@attributes={"name"=>"n1",
"updated_at"=>"2007-08-09 11:24:49",
"id"=>"3", "description"=>"d1",
"created_at"=>"2007-08-09 11:24:49"}>
# All works only because the locale is en-US...
Globalize::Locale.set "it-IT"
=> #<Globalize::Locale:0xb769271c @currency_decimal_sep=",",
@currency_format="EURO %n", @decimal_sep=",",
@language=Italian,
@code="it-IT", @date_format=nil, @thousands_sep=".",
@country=#<Globalize::Country:0xb768ff08
@attributes={"date_format"=>nil,
"currency_decimal_sep"=>",",
"thousands_sep"=>".",
"code"=>"IT",
"number_grouping_scheme"=>"western",
"english_name"=>"Italy",
"decimal_sep"=>",", "id"=>"106",
"currency_code"=>"EUR",
"currency_format"=>"EURO %n"}>,
@number_grouping_scheme=:western, @currency_code="EUR">
Test1.find_by_description("d1")
ActiveRecord::StatementInvalid: Mysql::Error: You have an error in your
SQL syntax; check the manual that corresponds to your MySQL server
version for the right syntax to use near ''COALESCE(t_description.text,
test1s.description) = ''d1'') LIMIT 1'' at line 1:
SELECT test1s.id,
test1s.name, test1s.created_at, test1s.updated_at,
COALESCE(t_description.text, test1s.description) AS description,
t_description.text AS description_not_base FROM test1s LEFT OUTER
JOIN globalize_translations AS t_description ON t_description.table_name
= ''test1s'' AND test1s.id = t_description.item_id AND
t_description.facet
= ''description'' AND t_description.language_id = 2600 WHERE
(test1s.
COALESCE(t_description.text, test1s.description) = ''d1'')
LIMIT 1
from
/usr/lib/ruby/gems/1.8/gems/activerecord-1.15.3/lib/active_record/connection_adapters/abstract_adapter.rb:128:in
`log''
from
/usr/lib/ruby/gems/1.8/gems/activerecord-1.15.3/lib/active_record/connection_adapters/mysql_adapter.rb:243:in
`execute''
from
/usr/lib/ruby/gems/1.8/gems/activerecord-1.15.3/lib/active_record/connection_adapters/mysql_adapter.rb:399:in
`select''
from
/usr/lib/ruby/gems/1.8/gems/activerecord-1.15.3/lib/active_record/connection_adapters/abstract/database_statements.rb:7:in
`select_all''
from
/usr/lib/ruby/gems/1.8/gems/activerecord-1.15.3/lib/active_record/base.rb:427:in
`find_by_sql''
from
/usr/lib/ruby/gems/1.8/gems/activerecord-1.15.3/lib/active_record/base.rb:997:in
`globalize_old_find_every''
from
./script/../config/../config/../vendor/plugins/for-1.2/lib/globalize/localization/db_translate.rb:885:in
`find_every''
from
/usr/lib/ruby/gems/1.8/gems/activerecord-1.15.3/lib/active_record/base.rb:991:in
`find_initial''
from
/usr/lib/ruby/gems/1.8/gems/activerecord-1.15.3/lib/active_record/base.rb:1204:in
`send''
from
/usr/lib/ruby/gems/1.8/gems/activerecord-1.15.3/lib/active_record/base.rb:1204:in
`method_missing''
from
/usr/lib/ruby/gems/1.8/gems/activesupport-1.4.2/lib/active_support/deprecation.rb:44:in
`silence''
from
/usr/lib/ruby/gems/1.8/gems/activerecord-1.15.3/lib/active_record/base.rb:1204:in
`method_missing''
from (irb):9
# And now this not works because the locale is "it-IT" WHY
????????????????
I think this is a Globalize bug but I''m not 100% sure...
Someone can help me ????
Thanks in advance to everyone...
Tex
--~--~---------~--~----~------------~-------~--~----~
You received this message because you are subscribed to the Google Groups
"Ruby on Rails: Talk" group.
To post to this group, send email to
rubyonrails-talk-/JYPxA39Uh5TLH3MbocFFw@public.gmane.org
To unsubscribe from this group, send email to
rubyonrails-talk-unsubscribe-/JYPxA39Uh5TLH3MbocFFw@public.gmane.org
For more options, visit this group at
http://groups.google.com/group/rubyonrails-talk?hl=en
-~----------~----~----~----~------~----~------~--~---