2011-08-22 4 views
0

私は次のモデルを持つWebアプリケーションを持っています:シフト、年、チェックアウト、セールス、ビジター。Railsはベストプラクティスをフィルタリングします

シフトにhas_manyをチェックアウト、セールス、訪問者 A年にhas_manyは私のアプリでは年

belong_to シフトシフトbelong_to

チェックアウト、販売や訪問者をシフトし、私はものの、多くの異なる年の存在を持ちたいです一度にアクティブなのはONEだけです。たとえば、シフトを表示するときは、アクティブな年のシフトだけを表示することが必要です。それだけで十分です。

私が本当に苦労しているのは、有効な年のすべてのチェックアウトを取得するためのクエリを作成することです。これを行うための簡単な方法はありますか?アクティブな年は実際にはsession [:current_year_id]というセッション変数に設定されます。

@checkouts = Shift.where('year_id = ?',session[:current_year_id]).checkouts 

しかし、それは私のために働いていないだろうと思った。それを稼働させるためには何を変更する必要がありますか?

チェックアウト、セールス、訪問者には、自分のyear_idはありません。彼らは彼らが属するシフトを通じてyear_idを持っています。

は解決済み:すべての助け以来、私は、すべての答えをupvoted

。私はfor_yearラムダ式を使用しました。私はすべての答えをupvotedしました。

最終的な答えを使用することでした:

Shift.for_year(session[:current_year_id]).collect{ |shift| shift.checkouts } 

答えて

1

使用すると、.whereは関係を返します。したがって、あなたの意図に基づいて2つの可能な回答があります。

あなたは最初シフトに属するチェックアウトを検索したい場合は、操作を行います。

@checkouts = Shift.where('year_id = ?',session[:current_year_id]).first.checkouts 

あなたがすべてシフト用すべてチェックアウト、ない場合:

@checkouts = Shift.where('year_id = ?',session[:current_year_id]).collect{|shift| shift.checkouts} 
1

あなたは試みることができる:

Shift.find_all_by_year_id(session[:current_year_id]) 

をこのセッションであるcurrent_year_idを前提としています。

私は.whereの使用に問題がありましたが、これは動的ファインダを使用して修正しました。

+0

私はまだそのすべてからチェックアウト/販売/質問/訪問者のリストを取得することはできません、しかし、。そのステートメントの終わりに.checkoutsをタックしてすべてのチェックアウトのコレクションを取得する方法を知りたい – jyanks

2

を現在の年をパラメータとするShiftモデルでスコープを作成することができます。

class Shift < ActiveRecord::Base 
    has_many :checkouts 
    scope :for_year, lambda { |current_year_id| where('year_id = ?', current_year_id) } 
end 

とコントローラでは、スコープに連鎖することにより、現在の年のためのチェックアウトを取得することができます。

Shift.for_year(session[:current_year_id]).map(&:checkouts) 
+0

"NoMethodError:未定義メソッド 'checkouts' for <#ActiveRecord:Relation" – jyanks

+0

シフトのコレクションではなく、1つのシフトアイテムに対してのみ.checkoutsや.salesなどを実行できます。 – jyanks

+0

おっと...私の悪い..今答えを更新しました – dexter

関連する問題