2013-04-08 14 views
6

Jestem nowy na szynach i próbowałem uzyskać dwa has_many: chociaż relacje do wypracowania (w przeciwieństwie do używania has_and_belongs_to_many jak wytłumaczyć ten post http://blog.flatironschool.com/post/35346328762/why-you-dont-need-has-and-belongs-to-many), ale teraz jestem z systemem do błędu Postgres:Rails has_many: through PG :: Błąd: ERROR: odwołanie do kolumny "id" jest niejednoznacznym błędem

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 tabeli

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) 

Komplety stołowe

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) 

składniki stół

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) 
+0

Dodatkowo, tablica kategorii została już wypełniona przed ustawieniem relacji has_many_though, a tabela kolekcji jest pusta. –

+0

Nie jestem pewien, czy to robi różnicę czy nie, ale kiedy wygenerowałem model collection_component wygenerowałem go jako "collection_components", a następnie ręcznie usunąłem "s" –

+0

Ręcznie usunięte środki? Skąd się usunąłeś? – codeit

Odpowiedz

14

Spróbuj tego:

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

podczas wykonywania join rosnące na id staje ambiguous kolumna, ponieważ kolumna components i collections ma kolumnę id. Nie będzie wiedział, którego użyć.

+0

Tak, to prawda, dziękuję! –

+0

Miałem podobny problem, gdy mogłem zlecać posty na blogu bez określania tabeli, a PG było gorące i niepokojące, gdy próbowałem renderować kolekcję części. To sprawiło, że dzięki, dzięki. –

+0

Wielkie dzięki! Krótkie i zwięzłe wyjaśnienie! – hernanvicente

Powiązane problemy