2012-01-10 11 views
5

Trong mô hình Widget của tôi, tôi đã điều sau đây:Làm cách nào để sử dụng phạm vi có Ransack trong Rails 3?

scope :accessible_to, lambda { |user| 
    if user.has_role?('admin') 
    self.all 
    else 
    roles = user.roles 
    role_ids = [] 
    roles.each { |r| role_ids << r.id } 
    self.joins(:widget_assignments).where('widget_assignments.role_id' => role_ids) 
    end 
} 

Lý tưởng nhất, tôi muốn sử dụng phạm vi này như một bộ lọc cho kết quả tìm kiếm Ransack, vì vậy trong điều khiển của tôi, tôi có:

def index 
    @q = Widget.accessible_to(current_user).search(params[:q]) 
    @widgets = @q.result.order('created_at DESC') 
end 

Làm điều này tạo ra lỗi sau:

undefined method `search' for Array:0x007ff9b87a0300

Tôi đoán rằng Ransack đang tìm đối tượng mối quan hệ ActiveRecord chứ không phải mảng. Có anyway mà tôi có thể sử dụng phạm vi của tôi như một bộ lọc cho Ransack?

+0

Không liên quan đến câu hỏi thực tế của bạn, nhưng nửa sau của phạm vi của bạn có thể dễ dàng được viết dưới dạng 'join (: widget_assignments) .where ('widget_assignments.role_id' => user.role_ids)'? hoặc 'user.roles.fetch (: id)'? Tôi có thể sai mặc dù :) –

Trả lời

8

Thay đổi self.all cho self.scoped. all trả về một mảng.

Cập nhật cho Rails 4: all giờ đây sẽ trả lại phạm vi.