2

Item has_many Pieces。_ 私には2つの方法があります。1つはピースが利用可能かどうかを調べる方法、もう1つはアイテムに利用可能なピースがあるかどうかを調べる方法です。

  # in piece.rb
  def available?(current_user, piece)
    if piece.status == 1
      true
    elsif piece.status == 2
      false
    elsif piece.status == 3
      true if piece.friend_id == current_user.id
    end
  end

  #in item.rb
  def available?(current_user, user, item)
    false
      item.pieces.each do |piece|
        if piece.available?(current_user, piece)
          true
        end
      end
  end

私のavailable?方法Itemは間違っています。利用可能な場合は返品し、利用できないtrue場合は返品してください。私のコードの背後にある理論は、を返す部分がない限り、メソッドは戻るというものです。私がコンソールでそれを行うとき、私が得るのはハッシュの断片だけであり、真または偽ではありません。Itempiecesfalsefalsetrue

誰かが私の問題を解決したり、これを行うためのより良い方法を教えてもらえますか?

4

3 に答える 3

10

使用Enumerable#any?

def available?(current_user, user, item)
  item.pieces.any? do |piece|
    piece.available?(current_user, piece)
  end
end
于 2012-11-12T12:24:10.547 に答える
4

アイテムに利用可能なピースが少なくとも 1 つあるかどうかを確認する必要がある場合、メソッドは次のようになります。

def available?(current_user, user, item)
  item.pieces.each do |piece|
    return true if piece.available?(current_user, piece)
  end
  false
end
于 2012-11-12T10:56:09.737 に答える
0

コードから推測すると、ピースのインスタンスメソッドであるため、ピースの2番目の引数は必要ないと思いavailable?ますPiece.rb。したがって、メソッドを次のようにリファクタリングすることをお勧めします。

def available_to?(current_user)
  if status == 1
    true
  elsif status == 2
    false
  elsif status == 3
    true if friend_id == current_user.id
  end
end

よりクリーンなインターフェースを提供します。

于 2012-11-12T11:10:35.007 に答える