I’m having a hell of a time getting HABTM working as advertised.
I’ve got my models: Person and Alias.
class Person < ActiveRecord::Base
has_and_belongs_to_many :aliases
end
class Alias < ActiveRecord::Base
has_and_belongs_to_many :people
end
I’ve built my sqlite3 database using the following migration:
class CreateAndAssociatePeopleAndAliases < ActiveRecord::Migration
def self.up
create_table :people do |t|
t.column :first_name, :string
t.column :last_name, :string
end
create_table :aliases do |t|
t.column :name, :string
end
create_table :people_aliases, {:id => false} do |t|
t.column :person_id, :integer
t.column :alias_id, :integer
end
end
def self.down
drop_table :people
drop_table :aliases
drop_table :people_aliases
end
end
I pop open the console, create a person:
p = Person.new(:first_name => ‘Buster’, :last_name => ‘McThunderstick’)
=> #…
p.aliases
=> []
p.save
p.id
=> 1
Now, if I attempt any action that comes within spitting distance of
p.aliases, everything blows up. This includes p.aliases, p.destroy,
etc.
Here’s the error:
ActiveRecord::StatementInvalid: ActiveRecord::StatementInvalid
from
./script/…/config/…/config/…/vendor/rails/activerecord/lib/active_record/connection_adapters/sqlite_adapter.rb:266:in
table_structure' from ./script/../config/../config/../vendor/rails/activerecord/lib/../../activesupport/lib/active_support/core_ext/object/misc.rb:23:in
returning’
from
./script/…/config/…/config/…/vendor/rails/activerecord/lib/active_record/connection_adapters/sqlite_adapter.rb:265:in
table_structure' from ./script/../config/../config/../vendor/rails/activerecord/lib/active_record/connection_adapters/sqlite_adapter.rb:203:in
columns’
from
./script/…/config/…/config/…/vendor/rails/activerecord/lib/active_record/associations/has_and_belongs_to_many_association.rb:165:in
finding_with_ambigious_select?' from ./script/../config/../config/../vendor/rails/activerecord/lib/active_record/associations/has_and_belongs_to_many_association.rb:55:in
find’
from
./script/…/config/…/config/…/vendor/rails/activerecord/lib/active_record/associations/association_collection.rb:159:in
find_target' from ./script/../config/../config/../vendor/rails/activerecord/lib/active_record/associations/association_proxy.rb:129:in
load_target’
from
./script/…/config/…/config/…/vendor/rails/activerecord/lib/active_record/associations/association_proxy.rb:122:in
method_missing' from ./script/../config/../config/../vendor/rails/activerecord/lib/active_record/associations/has_and_belongs_to_many_association.rb:91:in
method_missing’
from /opt/local/lib/ruby/1.8/irb.rb:298:in output_value' from /opt/local/lib/ruby/1.8/irb.rb:151:in
eval_input’
from /opt/local/lib/ruby/1.8/irb.rb:259:in signal_status' from /opt/local/lib/ruby/1.8/irb.rb:147:in
eval_input’
from /opt/local/lib/ruby/1.8/irb.rb:146:in eval_input' from /opt/local/lib/ruby/1.8/irb.rb:70:in
start’
from /opt/local/lib/ruby/1.8/irb.rb:69:in `start’
from /opt/local/bin/irb:13>>
I do have a workaround in place. If I include the join_table option in
my
habtm calls, everything suddenly works.
But why do I have to add the join_table option? I’m following the
principle
of convention plus redundant configuration.
This problem exists on Windows XP and OS X with both GemRails and Edge.
Is
this a known issue?
And for that matter, what’s an ambigious_select?