2011-10-21 18 views
1

ハンドバッグは、ブラック、ブラウン、オレンジ、レッドの4色からなるオンラインハンドバッグストアを運営しています。私は、黒いハンドバッグが茶色のハンドバッグよりも早く売れることに気付いています。つまり、黒いハンドバッグのような人々が一番です。このコードを改善するには

オンラインストアのホームページでは、グリッドレイアウトで10袋を選択して表示したいと考えています。だから私は黒い袋を選ぶことから始めます。私の目録に10個以上の黒い袋がある場合、私は停止し、他の色の袋の残りを探すことはありません。しかし、もし私が5つの黒い袋を持っているなら、私は茶色の袋を探し続けます。私はまだ10袋を持っていない場合、それらの茶色の袋を追加した後、私はオレンジの袋などを探します。以下は

はRailsのモデルのメソッドとしてソリューションを実装する時、私の試みです:

class Handbag < ActiveRecord::Base 
    belongs_to :store 
    attr_accessor :color 
end 

class Store < ActiveRecord::Base 
    has_many :handbags 

    def handags_for_display 
    selected_handbags = [] 
    ["black", "brown", "orange", "red"].each do |color| 
     bags = get_handbags_by_color(color) 
     selected_bags += bags 
     if selected_bags.size >= 10 
     selected_handbags = selected_handbags[0..9] 
     break 
     end 
    end 
    selected_handbags 
    end 

    private 
    def get_handbags_by_color(color) 
    handbags.where("color = ?", color).limit(10) 
    end 
end 

この作品が、それを書くためのより良い方法がある場合、私は好奇心旺盛です。特に、このコードはRubyのEnumeratorを使用するように変換できると思います。

+0

[Code Review.SE](http://s.tk/review)の方がより良い質問です。 –

答えて

0

あなたは一度だけのような何かやっでデータベースを照会する必要があります

@page_offset = ((params[:page].to_i-1)*10) || 0 
Handbag.order("color ASC").limit(10).offset(@page_offset) 

幸いな色が既にアルファベット順であることが起こるの。

+0

彼は10個以上の黒い袋を持っているので、これはうまくいきません.... – davidb

+0

その場合に対応しています。また、私が投票した人は理由を説明してください。 – Dex

+0

@Dex解決策は正しく動作します。モデルを使って作業している間に、私はRubyよりもSQLの観点から考えることに慣れなければなりません。ところで、私は10以上のハンドバッグを表示することはないので、ページネーションは必要ありません。 – ardsrk

-1
def handags_for_display 
    handbags = Array.new 
    [{ :color => 'black', :count => 5 }, { :color => 'brown' , :count => 2 }, { :color => 'orange', :count => 1 }, { :color => 'red', :count => 1}].each do |handbag| 
      handbags+=Handbag.where("color = ?", handbag[:color]).limit(handbag[:count]) 
    end 
    handbags 
end 
0

このような再帰関数を試すことができます。これは期待どおりに動作します(これを実行すると{:black => 1, :brown => 8, :orange => 1}となります)。代わりにget_handbags_by_colorを変更して、Railsで動作させることができます。

@bags = { 
    :black => 1, 
    :brown => 8, 
    :orange => 10, 
    :red => 10 
} 

@handbag_order = [:black, :brown, :orange, :red] 
@max_bags = 10 

def get_handbags_by_color(color,limit) 
    num = @bags[color] 
    num > limit ? limit : num 
end 

def handbags_for_display(index = 0, total = 0) 
    color = @handbag_order[index] 
    return {} unless color 
    handbags = {color => get_handbags_by_color(color,@max_bags - total)} 
    total += handbags.values.inject{|sum,x| sum+x} 

    handbags.merge!(handbags_for_display(index+1, total)) unless(total >= @max_bags) 
    handbags 
end 

handbags = handbags_for_display 
+0

受け入れられた回答を区別するだけで、いつでも注文を変更したり、制限を簡単に変更したり、制限に達するのに必要な数だけクエリを実行したりすることができます – Fotios

関連する問題