2016-03-16 6 views
6

Şu anda bir ActiveRecord::Relation nesnesi tarafından yakalanan kayıtları değiştirmek istediğim bir sınıf yöntemim var. Ancak, bir sınıf yönteminde mevcut kapsamı nasıl anlatacağımı bilmiyorum. self bunu yapmaz.Model sınıf yöntemi içinde yakalanmış kayıtları belirtin

Örnek:

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 

böyle kullanmak olacaktır:

User.some_scope.modify_those_records 

Yani User.some_scope bana User kayıtların bir demet içeren bir ActiveRecord::Relation dönecekti. Daha sonra bu kayıtları o sınıf yönteminde değiştirmek ve sonra geri göndermek istiyorum.

Sorun: Bir sınıf yöntemindeki "bu kayıt grubunu" açık bir şekilde nasıl anlatacağımı bilmiyorum.

+2

'current_scope.to_a' kullanmayı deneyin – MrYoshiji

+0

" Yakalanan "ile ne demek istiyorsun? –

+0

@MrYoshiji Mükemmel! Teşekkür ederim. Size cevap verebilmem için bir cevap verin. – Neil

cevap

4

Sen current_scope kullanabilirsiniz:

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

Bu kod ima:


onların yönetici haklarına dayalı Kullanıcılar sipariş etmek isterseniz

def self.modify_those_records 
    current_scope.each do |user| 
    user.do_something! 
    end 
end 
, kullanmak ActiveRecord daha iyi olurdu Kullanıcı tablosunda bir boolean sütunu is_admin var.

2

each ile bir kapsam bileşiminin ve bir örnek yönteminin, bir sınıf yönteminden daha kolay anlaşılması gerektiğini savunuyorum. Bir örnek yöntemi

User.some_scope.each(&:modify) 

ve uygulamak:

# in user.rb 
def modify 
    # whatever needs to be done 
end 
ben böyle bir şey yapsın

nedenle yerine User.some_scope.modify_those_records: Ve bir bonus olarak size izolasyon tüm adımları test edebilirsiniz, çünkü test etmek daha kolaydır

+0

Yapmaya çalıştığım şu anki şuydu: Bir kullanıcı grubunun yönetici kullanıcısı varsa: o zaman dışarı çıkarın ve ardından öne doğru itin. Bunu bir örnek yöntemiyle yapabileceğime emin değilim. Bence bunu, activerecord'ı bir diziye dönüştüren, bu işi yapan ve sonra diziyi döndüren (veya tekrar aktif bir kayıt ilişkisine geri dönüştüren) bir sınıf yöntemiyle yapmam gerekecek. Ama yanılıyor olabilirim. – Neil

+1

@Neil Kullanıcılara bir sıralama alanı verebilirsiniz, admin için 1, diğerleri için 0 ve azalarak, tüm kayıtları getirmeye gerek yoktur (bu, sayfalara ayrılmaya neden olabilir) – Vasfed

+0

@Neil: Yönetici kullanıcılarını nasıl tanımlarsınız? Boole bayrağı var mı? – spickermann

1

Sadece kayıtların sırasını değiştirmek isterseniz - daha iyi bir yol, bir sıralama alanı (zaten sahip değilseniz) modele eklemek ve buna göre sıralamaktır.

User.some_scope.order(name: :asc).order(is_admin: :desc)