2011-09-17 7 views
0

私はレールを学び、場所、カテゴリ、有効期限の3つの要素に基づいて製品が表示される製品ライブラリを設定しようとしています。ただ1つの有効期限)。有効期限が過ぎていない限り製品が表示され、場所とカテゴリの選択はドロップダウンメニューを介して行われます。レール:複数のパラメータに基づいて製品を表示

私は解決策を見つけた場所とカテゴリの選択基準を組み込むことが難しいうちにこの問題を書いていましたが、何ができるかについての助けがあれば大いに感謝します。

私は接続を通じてhas_manyを使用して、製品、場所、カテゴリ間の接続を作成しました。ここで

はモデルです:

class Product < ActiveRecord::Base 
    has_many :categorizations 
    has_many :categories, :through => :categorizations 
    has_many :localizations 
    has_many :locations, :through => :localizations 
end 

class Categorization < ActiveRecord::Base 
    belongs_to :product 
    belongs_to :category 
end 

class Category < ActiveRecord::Base 
    has_many :categorizations 
    has_many :products, :through => :categorizations 
end 

class Localization < ActiveRecord::Base 
    belongs_to :product 
    belongs_to :location 
end 

class Location < ActiveRecord::Base 
    has_many :localizations 
    has_many :products, :through => :localizations 
end 

は、ここに私のコントローラです。場所&カテゴリID年代はのparamsとして渡されており、製品の有効期限は、現在の時間よりも大きくなければなりません:

class LibraryController < ApplicationController 
    def index 
    @products = Product.find(:all, include => [ :locations, :categories ], 
           :conditions => ['expiry_date > ? AND locations.id = ? AND categories.id = ?', 
           Time.now, params[:location_id],params[:category_id]]) 
    end 
end 

ので、URLにlocation_idのとCATEGORY_IDのparamsを渡すことで、私は両方の組み合わせによって製品を一覧表示することができます。

私がしようとしていることを達成するためのより良い方法はありますか?

+2

「より良い」と定義します。あなたのコードは現在動作していますか?それは間違いを投げているのですか?それはあなたの予想よりも遅いですか?改善したい実際の問題は何ですか(つまり、どのような種類のヘルプをお探しですか)。 – jefflunt

+0

私は、全体的なアプローチが正しいのか、それとも間違っているのか疑問に思っています。コードは現在私が望むことをしますが、私がよりよく言えばもっと一般的なアプローチがありますか? – shane

答えて

0

いいえ、私はこの場合「より良い」方法があるとは思わない。確かにあなたがしたいことをする "異なる"方法がありますが、それに直面して、あなたがやっていることはうまくいきます。そして、 "このコードはひどいです!"または何か。

最終的に答えが「あなたの状況で他の人が行っていることをウェブで検索し、解決策が従来の/論理的 "であるか、またはこれらの種類の質問は、トピックに関する関連書籍の研究を介して回答される。

ので、それは、このような定性的な質問に答えることはほぼ不可能だ。どちらも「正しい」か「間違っている」

  • あるその多くはすべての問題を解決するにはいくつかの方法は、常にケースがEdgeのあります

    1. 人々が "規則"を破るところでは、たとえ独創的でない解決策でも、何かをする最良の方法であることが絶対にあり得ます。
    2. あなたは開発者です。ある程度あなたはリーダーシップの役割を果たし、最高のものを決めることが期待されています

    私があなたに具体的な結果を与えない限り、私があなたに "良い"達成しようとすると、(a)意見がいっぱいで、特定の目標に向けられていない回答、または(b)あなたを助けるかもしれない、あるいはしていないことを行う単に違う方法です。したがって、それらは実用的にはあまり有用ではない。

  • +0

    入力いただきありがとうございます、私はあなたのすべてのポイントを取る。主観的な質問ではなく、最終的な目標を持つ他の質問を試してみます。 – shane

    1

    これはまた、あなたがやりたいことになります。

    @products = Product.find_all_by_category_id_and_location_id(params[:category_id], params[:location_id]) 
    

    することもでき、ユーザおそらく見つけるよりも優れているProduct.where

    詳細については、Googleの「ダイナミックファインダー」を参照してください。

    +0

    あなたの提案のようなものを使用しようとしましたが、 'find_all_by_category_id_and_location_id'の定義されていないメソッドエラーがありました。 – shane

    +0

    ご使用の製品モデルでは使用できませんでした。 – Max

    0

    また、 "Product.where"(レール3.1での検索よりも優先される)を使用してソリューションを改善し、Railsのnamed_scopesに変換し、必要に応じてチェーンすることもできます。

    scope :not_expired, where('expiry_date > ?', Time.now) 
    
    +0

    それはありがとう、それは私の考え方を助けました。 – shane

    関連する問題