2016-03-16 5 views
6

के भीतर वर्तमान में हथियार वाले रिकॉर्ड निर्दिष्ट करें मेरे पास एक क्लास विधि है जहां मैं वर्तमान में ActiveRecord::Relation ऑब्जेक्ट द्वारा प्राप्त किए गए रिकॉर्ड्स को संशोधित करना चाहता हूं। लेकिन मुझे नहीं पता कि क्लास विधि में वर्तमान दायरे को कैसे संदर्भित किया जाए। self ऐसा नहीं करता है।मॉडल क्लास विधि

उदाहरण:

class User < ActiveRecord::Base 
    ... 

    def self.modify_those_records 
    #thought implicitly #to_a would be called on currently grabbed records but doesn't work 
    temp_users_to_a = to_a 
    ... 
    end 
end 

मैं इसे इस तरह का प्रयोग करेंगे:

User.some_scope.modify_those_records 

तो User.some_scope मुझे एक ActiveRecord::Relation कि User अभिलेखों का एक गुच्छा होता है में लौट आएंगे। मैं फिर उस वर्ग विधि के भीतर उन रिकॉर्ड्स को संशोधित करना चाहता हूं और फिर उन्हें वापस कराना चाहता हूं।

समस्या यह है: मुझे नहीं पता कि क्लास विधि के भीतर "रिकॉर्ड्स के उस समूह" को स्पष्ट रूप से कैसे संदर्भित किया जाए।

+2

'current_scope.to_a' – MrYoshiji

+0

का उपयोग करने का प्रयास करें" हथियार "से आपका क्या मतलब है? –

+0

@MrYoshiji उत्कृष्ट! धन्यवाद। एक उत्तर दें ताकि मैं आपको क्रेडिट दे सकूं। – Neil

उत्तर

4

आप current_scope उपयोग कर सकते हैं:

def self.modify_those_records 
    current_scope.each do |user| 
    user.do_something! 
    end 
end 

आप अपने व्यवस्थापक अधिकार के आधार पर उपयोगकर्ताओं के लिए चाहते हैं, तो आप बेहतर हो उपयोग करने के लिए होगा ActiveRecord:

scope :order_admins_first, order('CASE WHEN is_admin = true THEN 0 ELSE 1 END, id') 
User.some_scope.order_admins_first 

इस कोड है कि निकलता है आपके पास उपयोगकर्ता तालिका पर एक बूलियन कॉलम is_admin है।

2

मैं तर्क दूंगा कि each के साथ एक दायरे का संयोजन और एक विधि विधि क्लास विधि से समझना आसान है।

इसलिए बजाय User.some_scope.modify_those_records मैं की तरह कुछ करना होगा::

User.some_scope.each(&:modify) 

और लागू एक उदाहरण विधि:

# in user.rb 
def modify 
    # whatever needs to be done 
end 
और एक बोनस के रूप में यह, परीक्षण करने के लिए है क्योंकि आप अलगाव में सभी चरणों को परीक्षण कर सकते हैं आसान है
+0

वर्तमान बात जो मैं करने की कोशिश कर रहा हूं वह यह है: यदि उपयोगकर्ताओं के समूह में एक व्यवस्थापक उपयोगकर्ता है: तो इसे बाहर निकालें और फिर इसे आगे बढ़ें। मुझे यकीन नहीं है कि मैं इसे एक उदाहरण विधि के साथ कर सकता हूं। मुझे लगता है कि मुझे उस क्लास विधि के साथ ऐसा करने की आवश्यकता होगी जो Activerecord को किसी सरणी में बदलता है, वह व्यवसाय करता है और फिर सरणी देता है (या इसे फिर से सक्रिय रिकॉर्ड संबंध में बदल देता है)। लेकिन मुझसे गलती हो सकती है। – Neil

+1

@Neil आप उपयोगकर्ताओं को एक प्रकार का क्षेत्र, व्यवस्थापक के लिए 1, दूसरों के लिए 0 दे सकते हैं और इसके अवरुद्ध करके क्रमबद्ध कर सकते हैं, सभी रिकॉर्ड लाने की आवश्यकता नहीं है (क्योंकि यह पेजिनेशन तोड़ सकता है) – Vasfed

+0

@Neil: आप व्यवस्थापक उपयोगकर्ताओं की पहचान कैसे करते हैं? क्या उनके पास बुलियन ध्वज है? – spickermann

1

यदि आप केवल रिकॉर्ड्स के क्रम को संशोधित करना चाहते हैं - तो मॉडल के लिए एक प्रकार फ़ील्ड (यदि आपके पास पहले से नहीं है) जोड़ने का बेहतर तरीका है और उसके द्वारा क्रमबद्ध करें।

User.some_scope.order(name: :asc).order(is_admin: :desc) 
संबंधित मुद्दे