2012-03-28 30 views
5

Tôi đang cố gắng "truy cập bộ nhớ cache" số lượng bài đăng trong mỗi thẻ. Sau khi lưu gọi lại là làm việc nhưng sau khi tiêu diệt là không. Hình như phá hủy sql là không chính xác.ActiveRecord - has_many: thông qua,: depend =>: destroy sql không đúng

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 

Thử nghiệm thất bại

# @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 

Các sql đúng nên

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

Hãy thử sử dụng set_table_name thay vì table_name =? Tôi nghĩ rằng phương thức set_table_name thay đổi một vài thứ khác. –

+0

@joe Pym Điều đó không hiệu quả. Ngoài ra, set_table_name hiện không còn được dùng nữa. -> CẢNH BÁO KHÔNG DÙNG: Gọi set_table_name không được chấp nhận. Thay vào đó, hãy sử dụng 'self.table_name = 'the_name''. – Marcelo

+1

Tôi nhận được một lỗi rất giống nhau trong tình huống của tôi. Tôi cũng muốn một câu trả lời. – user1149547

Trả lời

0

tôi muốn đề nghị chức năng tăng/giảm riêng biệt và không sử dụng count + tiết kiệm. Điều này sẽ hoạt động đúng, hoạt động tốt, không kích hoạt các tác dụng phụ trên Thẻ và không làm hỏng số lượng của bạn trong điều kiện chủng tộc.

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

Có thể là bởi vì trong mô hình bạn sử dụng

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

thay vì

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

?

1

Tôi có cùng một vấn đề chính xác, việc sửa lỗi cho tôi là thêm cột khóa chính vào bảng kết nối (PostTag trong trường hợp của bạn).

Dường như đường ray cần khóa chính cho tùy chọn :dependent => :destroy hoạt động.

+0

Cảm ơn, không biết về OP nhưng điều này làm việc cho tôi. Đối với ': depend =>: destroy' Rails không chạy' WHERE foreign_key = smth' như mong đợi, nó tìm nạp con và sau đó chạy 'WHERE id = smth' cho mỗi cái. – yefrem

Các vấn đề liên quan