2012-01-10 8 views
5

मेरी विजेट मॉडल में मैं निम्नलिखित है:मैं रेल 3 में रंसैक के साथ स्कॉप्स का उपयोग कैसे कर सकता हूं?

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

कर:

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 
} 

आदर्श रूप में, मैं तो मेरे नियंत्रक में मेरे पास है, लूटना के खोज परिणामों के लिए एक फिल्टर के रूप में इस दायरे का उपयोग करना चाहेंगे

undefined method `search' for Array:0x007ff9b87a0300

मेरा अनुमान है कि कि लूटना एक ActiveRecord संबंध वस्तु और नहीं एक सरणी की तलाश में है: यह निम्न त्रुटि उत्पन्न करता है। क्या वैसे भी है कि मैं रेंसैक के लिए फ़िल्टर के रूप में अपने दायरे का उपयोग कर सकता हूं?

+0

आपके वास्तविक प्रश्न से संबंधित नहीं है, लेकिन आपके दायरे का दूसरा भाग शायद आसानी से 'जॉइन (: widget_assignments) के रूप में लिखा जा सकता है। कहीं (' widget_assignments.role_id '=> user.role_ids) '? या 'user.roles.fetch (: id)'? मुझसे गलती भी हो सकती है :) –

उत्तर

8

self.scoped के लिए self.all बदलें। all एक सरणी देता है।

रेल के लिए अद्यतन 4: all अब एक दायरा वापस कर देगा।