2013-10-23 19 views
5

ROR için yeni ve kapsamları anlamaya çalışıyorum. Mevcut uygulamamda tüm İşlemcileri alıyorum ve görüntüyü görüntüliyorum.Birden çok tabloya katılmak için kapsamlar nasıl kullanılır

class ProcessorsController 
    def index 
    @processors = Processor.all  
    end 
end 

Bu yüzden kullanıcı Admin yalnızca işlemcileri alabilirsiniz değiştirmek istiyor. İlişkilerim böyle kuruldu.

class Processor 
    belongs_to :feed 

    #SCOPES (what I have done so far) 
    scope :feed, joins(:feed) 
    scope :groups, joins(:feed => :groups).join(:user).where(:admin => true) 
end 

class Feed < ActiveRecord::Base 
    has_and_belongs_to_many :groups 
end 

class Group < ActiveRecord::Base 
    belongs_to :user 
end 

class User < ActiveRecord::Base 
    has_many :groups 
    scope :admin,  where(:admin  => true) 
end 

benim gözetlemek içinde

pry(main)> Processor.find(63).feed.groups.first.user.admin? 

PS bunu başardı: Birisi ilişkiler karmaşık olup olmadığını kapsamları kullanmayı öğrenmek olabilir bazı iyi kaynaklar sağlayabilir.

cevap

8
scope :with_admin, -> { joins(:feed => { :groups => :user }).where('users.admin' => true) } 

, sen official documentation on ActiveRecord joins geçmişler?

+0

Çok teşekkürler. Evet, doktora gittim, ama çoklu birleşmelerin kullanımını yakalamadım. –

+0

Cevabınız, gerçekten kapsamları içindeki birleşimleri nasıl kullanacağımı açıkladı. Sadece aynı. Biri, metodu çağırmadan önce Model adı kısmını 'çıkarmanız' gerekir. – Francisco

1

Eğer kapsamları gerekmez ... Eğer kullanıcı ilişkileri ve koşulları kullanarak yönetici yerini sadece işlemcileri alabilirsiniz: Kaynaklara gelince

class Feed < ActiveRecord::Base 
    ... 
    has_one :user, through: :groups 
end 


class Processor 
    ... 
    has_one :admin, through: :feed, source: :user, conditions: ['users.admin = 1'] 
end 
+0

Anlamıyorum, ilişkimi değiştirmemi mi öneriyorsunuz? Ya mevcut ilişkimi korumak istersem? –

+0

güvenli bir şekilde sizinkileri değiştirmeden önerdiğim iki ilişkiyi ekleyebilirsin – okliv

İlgili konular