Rails has_many: via PG :: Error: ERROR: link to column "id" - an ambiguous error

I am new to rails and I tried to get two has_many: although the relationship is for development (as opposed to using has_and_belongs_to_many, as explained by this post http://blog.flatironschool.com/post/35346328762/why-you-dont-need-has -and-belongs-to-many ), but now I encountered a Postgres error:

PG::Error: ERROR: column reference "id" is ambiguous LINE 1: ...on_id" IS NULL AND "components"."id" = 1 ORDER BY id ASC LIM... ^ : SELECT 1 AS one FROM "components" INNER JOIN "collection_components" ON "components"."id" = "collection_components"."component_id" WHERE "collection_components"."collection_id" IS NULL AND "components"."id" = 1 ORDER BY id ASC LIMIT 1 Rendered collections/_form.html.haml (117.0ms) Rendered collections/new.html.haml within layouts/application (143.5ms) Completed 500 Internal Server Error in 164ms ActiveRecord::StatementInvalid - PG::Error: ERROR: column reference "id" is ambiguous LINE 1: ...on_id" IS NULL AND "components"."id" = 1 ORDER BY id ASC LIM... ^ 

_form.html.haml

 = form_for @collection do |f| - if @collection.errors.any? #error_explanation %h1= "#{pluralize(@collection.errors.count, "error")} prohibited this collection from being saved:" %ul - @collection.errors.full_messages.each do |msg| %li= msg .field - Component.all.each do |component| = label_tag :component_ids, component.id = check_box_tag :component_ids, component.id, @collection.components.include?(component), :name => 'collection[component_ids][]' .field = f.label :title = f.text_field :title .actions = f.submit 'Save' 

collection_component.rb

 class CollectionComponent < ActiveRecord::Base attr_accessible :collection_id, :component_id belongs_to :collection belongs_to :component end 

collection.rb

 class Collection < ActiveRecord::Base default_scope order('id ASC') attr_accessible :style_id, :name, :title, :component #has_and_belongs_to_many :components has_many :collection_components, :dependent => :destroy has_many :components, :through => :collection_components belongs_to :style validates_presence_of :style validates_presence_of :title before_save :create_name private def create_name self.name = title.parameterize end end 

component.rb

 class Component < ActiveRecord::Base default_scope order('id ASC') attr_accessible :category_id, :name, :title, :collection, :style has_many :collection_components, :dependent => :destroy has_many :collections, :through => :collection_components has_many :component_styles has_many :styles, :through => :component_styles belongs_to :category validates_presence_of :category validates_presence_of :title before_save :create_name private def create_name self.name = title.parameterize end end 

collection_components table

 Column | Type | Modifiers ---------------+-----------------------------+-------------------------------------------------------------------- id | integer | not null default nextval('collection_components_id_seq'::regclass) collection_id | integer | component_id | integer | created_at | timestamp without time zone | not null updated_at | timestamp without time zone | not null Indexes: "collection_components_pkey" PRIMARY KEY, btree (id) 

collection table

 Column | Type | Modifiers ------------+-----------------------------+---------------------------------------------------------- id | integer | not null default nextval('collections_id_seq'::regclass) style_id | integer | name | character varying(255) | title | character varying(255) | created_at | timestamp without time zone | not null updated_at | timestamp without time zone | not null Indexes: "collections_pkey" PRIMARY KEY, btree (id) 

component table

  Column | Type | Modifiers -------------+-----------------------------+--------------------------------------------------------- id | integer | not null default nextval('components_id_seq'::regclass) name | character varying(255) | title | character varying(255) | category_id | integer | created_at | timestamp without time zone | not null updated_at | timestamp without time zone | not null Indexes: "components_pkey" PRIMARY KEY, btree (id) 
+6
source share
1 answer

Try the following:

  default_scope { order('collections.id ASC') } //collection.rb default_scope { order('components.id ASC') } //component.rb 

When you do join ascending on id , it becomes an ambiguous column, because both components and collections have an id column. He does not know what to use.

+14
source

All Articles