从方法内的块方法返回true或false

时间:2012-11-12 10:47:29

标签: ruby

Item has_many Pieces。我有两种方法,一种可以找出这件作品是否可用,另一种可以找出一件作品是否有可用的作品。

  # 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,除非有一个返回{{1}}的部分。当我在控制台中执行此操作时,我得到的是散列中的碎片,而不是真或假。

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

3 个答案:

答案 0 :(得分:10)

使用Enumerable#any?

def available?(current_user, user, item)
  item.pieces.any? do |piece|
    piece.available?(current_user, piece)
  end
end

答案 1 :(得分:2)

如果您需要检查项目是否至少有一个可用部分,方法可能如下所示:

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

答案 2 :(得分:0)

从代码中推断我认为available?中的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

它会给你一个更干净的界面。