2013-04-08 14 views
6

मैं रेल के लिए नया हूँ और मैं दो has_many प्राप्त करने की कोशिश कर रहा है: (हालांकि रिश्तों बाहर काम करने के रूप में has_and_belongs_to_many का उपयोग कर करने का विरोध किया के रूप में इस पोस्ट http://blog.flatironschool.com/post/35346328762/why-you-dont-need-has-and-belongs-to-many) द्वारा समझाया, लेकिन अब एक Postgres त्रुटि में चल रहा हूँ:रेल has_many: के माध्यम से पीजी :: त्रुटि: त्रुटि: स्तंभ संदर्भ "आईडी" अस्पष्ट त्रुटि

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 तालिका

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) 

संग्रह तालिका

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) 

घटकों तालिका

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

इसके अतिरिक्त, श्रेणियों की तालिका पहले से ही has_many_though संबंध स्थापित करने से पहले पॉप्युलेट हो चुकी है और संग्रह तालिका खाली है। –

+0

मुझे यकीन नहीं है कि इससे कोई फर्क पड़ता है या नहीं, लेकिन जब मैंने संग्रह_कंपोनेंट मॉडल जेनरेट किया, तो मैंने इसे "collection_components" के रूप में जेनरेट किया और बाद में मैन्युअल रूप से "s" –

+0

मैन्युअल रूप से हटाए गए साधनों को हटा दिया ?? तुमने कहाँ से हटा दिया? – codeit

उत्तर

14

आज़माएं:

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

जब आप प्रदर्शन id पर एक join आरोहीहो जाता हैकॉलम क्योंकि components और collections दोनों id कॉलम हैं। यह नहीं पता कि किस का उपयोग करना है।

+0

हाँ, यह किया, धन्यवाद! –

+0

मेरे पास एक समान समस्या थी जहां मैंने टेबल निर्दिष्ट किए बिना ब्लॉग पोस्ट ऑर्डर करने का दायरा बनाया था और जब मैंने आंशिक संग्रहों को संग्रहित करने का प्रयास किया तो पीजी गर्म और परेशान हो गया। यह चाल है, धन्यवाद। –

+0

बहुत बहुत धन्यवाद! लघु और संक्षिप्त स्पष्टीकरण! – hernanvicente

संबंधित मुद्दे