2012-02-22 22 views
5

Tôi đang làm việc để thêm một counter_cache để mô hình của tôi:Có thể sử dụng counter_cache với has_many không?

Người dùng (id, org_id) Orgs (id, USERS_COUNT)

Nhưng nhận được lỗi sau: ArgumentError (Unknown key(s): counter_cache):

class Org < ActiveRecord::Base 
    has_many :users, :counter_cache => true 

class User < ActiveRecord::Base 
    belongs_to :org 

Bất kỳ ý tưởng những gì được thiết lập sai. Tôi muốn Org.users_count trả lại counter_cache cho # người dùng trong tổ chức đó?

Trả lời

14

Nó không hoạt động theo cách này. Bạn phải di chuyển counter_cache đến belongs_to:

class User < ActiveRecord::Base 
    belongs_to :org, :counter_cache => true 
end 

Và thêm một lĩnh vực users_count với mô hình Org và sau đó Rails sẽ cập nhật các trường dành cho bạn. Đừng quên thêm :default=> 0 khi di chuyển, nếu không nó sẽ không hoạt động tốt.

Nếu bạn đã một số dữ liệu trong ứng dụng của bạn và bạn muốn đồng bộ hóa các truy cập, bạn có thể chạy (sau khi di cư) giống như sau:

Org.find(:all).each do |o| 
    Org.update_counters o.id, :users_count => o.users.count 
    end 
+0

Cảm ơn bạn, mà dường như đã giúp đỡ. Cách tốt nhất để kích hoạt đặt lại cho các bản ghi hiện có là gì? Tôi có thể chạy nó như là một công việc cào cho tôi đã chạy di chuyển? – AnApprentice

+1

Tôi đã chỉnh sửa câu hỏi. Bạn có thể chạy mã đó bằng 'đường ray runner ' – lucapette

+1

@AnApprentice nếu câu trả lời giải quyết được vấn đề của bạn, vui lòng đánh dấu nó là đã được chấp nhận;) – lucapette

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