2012-03-03 6 views
0

に参加します。トラブルを考え出す、私はアカウント、チケット、グループを持っている協会

何らかの理由で、私は一日中頭がおかしくなっていて、それは非常にシンプルにすべきだと思われますが、私はそれを理解できません。

UPDATE

私も同様にチケットモデルのスコープを命名している:

scope :not_archived, where('archived != ?', 1) 
    scope :is_archived, where('archived = ?', 1) 

だから私は、同様に.not_archivedまたは.is_archivedを追加することが可能に必要があると思います。 @Veraticusの答えがうまくいくかどうかは分かりません。

+0

いいね、ありがとうAndrew – Marc

答えて

0

あなたは引数として考慮されますチケットに名前の範囲を作成することができます。

ようなSQLを生成する必要があります
#ticket.rb 
scope :for_account lambda { |account| joins(:group => :accounts).where("accounts.id = ?", account.id) } 

:あなたはそれから呼び出すことができます

SELECT ticets.* FROM ticket 
INNER JOIN groups ON tickets.groups_id = groups.id 
    INNER JOIN accounts ON groups.account_id = accounts.id 
WHERE accounts.id = x 

Ticket.for_account(current_account) 

現行のアカウントのチケットを取得するには、1つのクエリですべてを引き出します。たとえば、これを他の任意のスコープとチェーンすることができます。

Ticket.not_archived.for_account(current_account) 
+0

今、私はこの 'Associationという名前の 'account'が見つかりませんでした。おそらく間違って入力したでしょうか? ' – Marc

+0

これは結合のアカウントにする必要があります。私は答えを編集します。 – Oliver

+0

と 'scope:for_account'の後ろにカンマがあるはずです。 – Marc

0

私はあなたがこのような何かを探していると思う:current_accountの基に結合したチケットのすべての配列の配列を返します

current_account.groups.collect(&:tickets) 

current_account.groups.collect(&:tickets).flatten 

あなたが適用されるスコープを持っている場合、私はこのような何かしたい:あなたと

current_account.groups.collect{|g| g.tickets.not_archived.all}.flatten 

をあなただけの一つの大きな配列としてそれをしたい場合は、最後に平らに呼び出すことができますスコープをあなたが望むものに置き換えます。

+0

標準のインデックスページのようにループしたいのですが? – Marc

+0

心配しないで...私はcurrent_account.groups.collect(&:tickets).flattenのループを作成しました。これを行う最も効率的な方法はありますか? – Marc

+0

上記の更新を参照してください。 – Marc

関連する問題