2013-10-23 15 views
5

Sono nuovo di ROR e sto cercando di capire gli ambiti. Nella mia attuale implementazione sto ricevendo tutti i processori e mostrandoli nella vista.Come utilizzare gli ambiti per unire più tabelle

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

Voglio modificare questo modo che io possa ottenere solo i processori in cui l'utente è admin. Ecco come vengono stabilite le mie relazioni.

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 

sono stato in grado di fare questo nel mio leva

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

PS: qualcuno potrebbe fornire alcune buone risorse in cui ho potuto imparare a utilizzare gli ambiti se le relazioni sono complesse.

risposta

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

Per quanto riguarda le risorse, avete attraversato la official documentation on ActiveRecord joins?

+0

Grazie mille. Sì, ho fatto approfondire quel documento, ma non ho notato l'uso di più join. –

+0

La tua risposta mi ha davvero illustrato su come utilizzare i join all'interno degli ambiti. È lo stesso. È sufficiente "omettere" la parte Nome modello prima di chiamare il metodo. – Francisco

1

non hai bisogno di ambiti ... si può ottenere solo i processori in cui l'utente è admin utilizzando le relazioni e le condizioni:

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

Non capisco, mi stai suggerendo di modificare la mia relazione? Cosa succede se voglio mantenere la mia relazione esistente? –

+0

puoi tranquillamente aggiungere due relazioni che ho proposto senza modificare le tue – okliv