2

一个Item has_many Pieces。我有两种方法,一种是判断 Piece 是否可用,另一种是判断 Item 是否有可用的部分。

  # 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如果Item有可用pieces,我希望它返回,false如果没有。我的代码背后的理论是该方法返回false,除非有一个返回true。当我在控制台中执行此操作时,我得到的只是散列中的片段,而不是真假。

任何人都可以解决我的问题或告诉我更好的方法吗?

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

如果您需要检查 item 是否至少有一个可用件,该方法可以如下所示:

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

从您的代码中推断,我认为available?in 方法Piece.rb不需要第二个参数,因为它是 Piece 的实例方法。所以我建议你将方法重构为:

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 回答