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の列挙子を使用するように変換できると思います。

4

3 に答える 3

0

次のようなことを行って、データベースに一度にクエリを実行する必要があります。

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

幸いなことに、色はすでにアルファベット順になっています。

于 2011-10-21T12:53:42.433 に答える
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
于 2011-10-21T13:31:58.607 に答える
-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
于 2011-10-21T13:02:07.423 に答える