2012-03-28 8 views
5

मैं प्रत्येक टैग में पोस्ट की संख्या "काउंटर कैश" करने का प्रयास कर रहा हूं। कॉलबैक सहेजने के बाद काम कर रहा है लेकिन नष्ट होने के बाद नहीं है। ऐसा लगता है कि एसक्यूएल को नष्ट करना सही नहीं है।ActiveRecord - has_many: through,: dependent =>: sql को नष्ट करना सही नहीं है

class Post < ActiveRecord::Base 
    has_many :post_tags, :dependent => :destroy 
    has_many :tags, :through => :post_tags 
end 

class Tag < ActiveRecord::Base 
    has_many :post_tags, :dependent => :destroy 
    has_many :posts, :through => :post_tags 
end 

class PostTag < ActiveRecord::Base 
    self.table_name = :posts_tags 
    belongs_to :post 
    belongs_to :tag 

    after_save :update_tag_posts_count 
    after_destroy :update_tag_posts_count 

    def update_tag_posts_count 
    tag.posts_count = tag.posts.count 
    tag.save 
    end 
end 

परीक्षण विफल रहता है

# @tag.posts_count == 10 
Failure/Error: @tag.posts.first.destroy 
ActiveRecord::StatementInvalid: 
Mysql2::Error: Unknown column 'posts_tags.' in 'where clause': DELETE FROM `posts_tags` WHERE `posts_tags`.`` = NULL 

सही एसक्यूएल होना चाहिए

DELETE FROM `posts_tags` WHERE `posts_tags`.`post_id` = {the post id} 
+0

table_name = के बजाय set_table_name का उपयोग करने का प्रयास करें? मुझे लगता है कि विधि set_table_name कुछ और चीजें बदलती है। –

+0

@ जो पिम ने काम नहीं किया। इसके अलावा, set_table_name अब बहिष्कृत है। -> अस्वीकरण चेतावनी: कॉल_table_name को कॉल करना बहिष्कृत है। कृपया इसके बजाय 'self.table_name =' the_name'' का उपयोग करें। – Marcelo

+1

मुझे मेरी स्थिति में एक बहुत ही समान त्रुटि मिल रही है। मुझे भी एक जवाब चाहिए। – user1149547

उत्तर

0

मैं गिनती का उपयोग कर अलग वेतन वृद्धि/कमी कार्य करता है और नहीं सुझाव है + बचाने के चाहते हैं। यह ठीक से काम करना चाहिए, अच्छी तरह से प्रदर्शन करना चाहिए, टैग पर दुष्प्रभावों को ट्रिगर नहीं करना चाहिए, और दौड़ की स्थिति में अपनी गिनती को गड़बड़ नहीं करना चाहिए।

class PostTag < ActiveRecord::Base 

    belongs_to :post 
    belongs_to :tag 

    after_create :increment_tag_posts_counter 
    after_destroy :decrement_tag_posts_counter 

    private 

    def increment_tag_posts_counter 
    Tag.increment_counter :posts_count, post_id 
    end 

    def decrement_tag_posts_counter 
    Tag.decrement_counter :posts_count, post_id 
    end 
end 
0

हो सकता है क्योंकि मॉडल में आप

#post.rb 
has_many :posts_tags, :dependent => :destroy 
#tag.rb 
has_many :posts_tags, :dependent => :destroy 

के बजाय

#post.rb 
has_many :post_tags, :dependent => :destroy 
#tag.rb 
has_many :post_tags, :dependent => :destroy 

इस्तेमाल किया?

1

मेरे पास एक ही समस्या थी, मेरे लिए फिक्स जॉइन टेबल (आपके मामले में पोस्टटाग) में प्राथमिक कुंजी कॉलम जोड़ना था।

ऐसा लगता है कि रेल को काम करने के लिए :dependent => :destroy विकल्प के लिए प्राथमिक कुंजी की आवश्यकता है।

+0

धन्यवाद, ओपी के बारे में नहीं पता लेकिन यह मेरे लिए काम करता है। 'के लिए: निर्भर =>: नष्ट करें 'रेल नहीं चलती है' जहां विदेशी_की = smth' की अपेक्षा की जाती है, यह बच्चों को लाती है और फिर प्रत्येक के लिए 'आईडी आईडी = smth' चलाती है। – yefrem

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