2013-10-23 6 views
5

私はRORを初めて使用しており、スコープを理解しようとしています。私の現在の実装では、すべてのプロセッサを取得してビューに表示しています。スコープを使用して複数のテーブルを結合する方法

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

私は、ユーザーが管理者あるだけのプロセッサを得ることができるので、これを変更したいです。これは私の関係がどのように設定されているかです。

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 

は、私は私のてこに

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

PSこれを行うことができた:誰かが私は関係が複雑な場合はスコープを使用する方法を学ぶことができるいくつかの良いリソースを提供することができます。あなたはスコープを必要としない

答えて

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

を、あなたはofficial documentation on ActiveRecord joinsを経てきましたか?

+0

ありがとうございます。はい、私はその文書を徹底的に調べましたが、複数の結合を使用することはありませんでした。 –

+0

あなたの答えは、実際にスコープ内の結合を使用する方法を私に示してくれました。それはまったく同じです。メソッドを呼び出す前に、モデル名の部分を '省略'するだけです。 – Francisco

1

...あなたは、ユーザーが関係して条件を使用して管理者にのみプロセッサ得ることができます:リソースについては

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

私は理解していません、私の関係を変更することを提案していますか?既存の関係を維持したいのですが? –

+0

2つの関係を安全に追加することができます。あなたの変更なしに提案しました – okliv

関連する問題