When I run a RSpec test for (JRuby + sqlite), but not (Ruby 1.9.3 + [mysql | postgres]) describe SomeModel do it { should have_db_index(:name).unique(true) } end The spec fails even though the schema.rb shows the db field as unquiely indexed. ActiveRecord::Schema.define(:version => 20120908004000) do create_table "some_model", :force => true do |t|> t.string "name", :limit => 63, :null => false> end> add_index "apps", ["name"], :name => "index_apps_on_name", :unique => trueend The issue seems to be that MySQL and Postgres connection adapters behave differently than the Sqlite. So I did some digging. The *shoulda* matchers use this to evaluate index uniqueness. ::ActiveRecord::Base.connection.indexes(App.table_name).detect {|e| e. columns == ["name"]} # sqlite <struct ActiveRecord::ConnectionAdapters::IndexDefinition table="apps", name ="index_apps_on_name", unique=7, columns=["name"], lengths=nil, orders=nil> # mysql <struct ActiveRecord::ConnectionAdapters::IndexDefinition table="apps", name ="index_apps_on_name", unique=true, columns=["name"], lengths=nil, ordersnil> # postgres <struct ActiveRecord::ConnectionAdapters::IndexDefinition table="apps", name ="index_apps_on_name", unique=true, columns=["name"], lengths=nil, ordersnil> The difference is mysql2: unqiue = true, pg: unique = true, sqlite: unique = 7. (1) Is Sqlite unique supposed to be 7? I don''t think so. (2) If not, anyone know where would I go to refactor this? Somewhere in *ActiveRecord::ConnectionAdapters::SQLiteAdapter*? I tried looking in api.rubyonrails.org, but Postgres was the only adapter with the indexes method<http://api.rubyonrails.org/classes/ActiveRecord/ConnectionAdapters/PostgreSQLAdapter.html#method-i-indexes> . -- You received this message because you are subscribed to the Google Groups "Ruby on Rails: Core" group. To view this discussion on the web visit https://groups.google.com/d/msg/rubyonrails-core/-/OG3CRk-ssGkJ. To post to this group, send email to rubyonrails-core@googlegroups.com. To unsubscribe from this group, send email to rubyonrails-core+unsubscribe@googlegroups.com. For more options, visit this group at http://groups.google.com/group/rubyonrails-core?hl=en.
In Ruby, $ irb 1.9.3-p194 :001 > if 7 1.9.3-p194 :002?> puts "hey" 1.9.3-p194 :003?> end hey Sounds like someone''s got a bug. It should be just as true as the other ones. Here is the location of indexes in the SQLiteAdapter: https://github.com/rails/rails/blob/master/activerecord/lib/active_record/connection_adapters/sqlite3_adapter.rb#L400 You can''t assume the documentation always has everything in it. -- You received this message because you are subscribed to the Google Groups "Ruby on Rails: Core" group. To post to this group, send email to rubyonrails-core@googlegroups.com. To unsubscribe from this group, send email to rubyonrails-core+unsubscribe@googlegroups.com. For more options, visit this group at http://groups.google.com/group/rubyonrails-core?hl=en.
awesome. thanks. -- You received this message because you are subscribed to the Google Groups "Ruby on Rails: Core" group. To post to this group, send email to rubyonrails-core@googlegroups.com. To unsubscribe from this group, send email to rubyonrails-core+unsubscribe@googlegroups.com. For more options, visit this group at http://groups.google.com/group/rubyonrails-core?hl=en.
Oh, and in 3-2-stable, it''s here: https://github.com/rails/rails/blob/3-2-stable/activerecord/lib/active_record/connection_adapters/sqlite_adapter.rb#L361 But seriously, seems like Shoulda has a bug, not Rails. -- You received this message because you are subscribed to the Google Groups "Ruby on Rails: Core" group. To post to this group, send email to rubyonrails-core@googlegroups.com. To unsubscribe from this group, send email to rubyonrails-core+unsubscribe@googlegroups.com. For more options, visit this group at http://groups.google.com/group/rubyonrails-core?hl=en.
Yeah, if I''m reading this right, https://github.com/thoughtbot/shoulda-matchers/blob/master/lib/shoulda/matchers/active_record/have_db_index_matcher.rb#L65 is the offending line. I''d make this code more like is_unique = matched_index.unique is_unique = not is_unique unless @options[:unique] unless is_unique @missing = "#{table_name} has an index named #{matched_index.name} " << "of unique #{matched_index.unique}, not #{@options[:unique]}." end Of course, I just did that in vim, no tests, so I might have screwed it up... -- You received this message because you are subscribed to the Google Groups "Ruby on Rails: Core" group. To post to this group, send email to rubyonrails-core@googlegroups.com. To unsubscribe from this group, send email to rubyonrails-core+unsubscribe@googlegroups.com. For more options, visit this group at http://groups.google.com/group/rubyonrails-core?hl=en.
That would help. It might also be a jruby issue. ruby 1.9.3p194 (2012-04-20 revision 35410) [x86_64-darwin12.1.0] #<Enumerator: [#<struct ActiveRecord::ConnectionAdapters::IndexDefinition table="apps", name="index_apps_on_name", unique=true, columns=["name"], lengths=nil, orders=nil>]:detect> jruby 1.6.7.2 (ruby-1.9.2-p312) (2012-05-01 26e08ba) (Java HotSpot(TM) 64-Bit Server VM 1.7.0_07) [darwin-x86_64-java] #<Enumerator: [#<struct ActiveRecord::ConnectionAdapters::IndexDefinition table="apps", name="index_apps_on_name", unique=7, columns=["name"], lengths=nil, orders=nil>]:detect> -- You received this message because you are subscribed to the Google Groups "Ruby on Rails: Core" group. To view this discussion on the web visit https://groups.google.com/d/msg/rubyonrails-core/-/cWgTzS8NK7MJ. To post to this group, send email to rubyonrails-core@googlegroups.com. To unsubscribe from this group, send email to rubyonrails-core+unsubscribe@googlegroups.com. For more options, visit this group at http://groups.google.com/group/rubyonrails-core?hl=en.
I''ll test it on the rails-dev-box thingee tomorrow to make sure it''s not my env. -- You received this message because you are subscribed to the Google Groups "Ruby on Rails: Core" group. To view this discussion on the web visit https://groups.google.com/d/msg/rubyonrails-core/-/Lcis43-e398J. To post to this group, send email to rubyonrails-core@googlegroups.com. To unsubscribe from this group, send email to rubyonrails-core+unsubscribe@googlegroups.com. For more options, visit this group at http://groups.google.com/group/rubyonrails-core?hl=en.
Let''s see what team shoulda has to say: https://github.com/thoughtbot/shoulda-matchers/pull/156 -- You received this message because you are subscribed to the Google Groups "Ruby on Rails: Core" group. To post to this group, send email to rubyonrails-core@googlegroups.com. To unsubscribe from this group, send email to rubyonrails-core+unsubscribe@googlegroups.com. For more options, visit this group at http://groups.google.com/group/rubyonrails-core?hl=en.