1

次のスキーマを持つ Rails アプリがあります。

ユーザー (id、username、user_type、master_id) アイテム (id、itemname、is_master、master_id) 修理 (id、in_date、out_date、user_id、item_id)

アプリは小さいので、データベースをできるだけシンプルに保つようにしました。ユーザーは、管理者、ディーラー、またはマネージャーです。マネージャーは、彼の下に多くのディーラーを持つことができます (両方とも同じユーザー テーブルに格納されます)。

Item は、コンピューターのようなマスター アイテム (キーボード、マウスなどの多くのサブ アイテムを含む) にすることも、小さなサブ アイテムにすることもできます。マスター アイテムは、その下に多くのサブ アイテムを持つことができます。

修理はアイテムの修理履歴です。修理にはアイテムとユーザーが関連付けられています。

次のパラメーターを使用して検索しています(すべてオプション)

  • マネージャー名
  • 販売業者名
  • マスターアイテム
  • サブアイテム
  • 日付中
  • 期限切れ

ディーラー名が指定されていない場合は、マネージャー内のすべてのディーラーが指定された結果が必要です。サブアイテムが指定されていない場合は、マスターアイテムの下のすべてのアイテムが結果に含まれるようにします。

コードをシンプルで保守しやすいものにするには、検索コントローラーをどのように定義する必要がありますか? 条件ごとに「if」を実行したくありません。

4

1 に答える 1

1

Item.joins :repairs => :user

アイテムから修理までをユーザー様に代わって行います。その後、さまざまなフィールドが提供されている場合は、それらの等価性によってフィルタリングするだけです。幸いなことに、フィールド名が.where.

ビューの構造に応じて、空白 (空または nil) のすべてのパラメーターを除外する必要があります。 params.reject {|k,v| v.blank?}あなたのためにそれをすべきです。

それをすべてまとめると、

Item.joins(:repairs => :user).where(params.reject {|k,v| v.blank?})

または、関連付けヘルパーを設定している場合(絶対に行う必要があります)、それに近いものがうまくいく可能性があります。

于 2012-12-29T10:35:07.647 に答える