当只有一个结果存在时,在Rails应用程序中使用.each

时间:2013-12-04 03:52:02

标签: ruby-on-rails

我不明白为什么"每个"出现在第三行,因为我认为没有其他页面符合条件

:member_id => session[:user_id], :friend_id => params[:id]

你能告诉我为什么吗?

  def friend
    if Friend.where(:member_id => session[:user_id], :friend_id => params[:id]).exists? then
      Friend.where(:member_id => session[:user_id], :friend_id => params[:id]).each do |f|
       f.destroy
       end
    else
       Friend.new({:member_id => session[:user_id], :friend_id =>params[:id].to_i}).save
    end
    redirect_to :action => 'show', :id => params[:id]
  end

2 个答案:

答案 0 :(得分:1)

Active Record finder方法where返回一个数组,即使其中只有一个元素,因此您必须使用each遍历数组,或者如果您知道只返回一个数组,你可以使用first方法做一些事情,使用first方法的例子是:

def friend
  if Friend.where(:member_id => session[:user_id], :friend_id => params[:id]).exists?
    Friend.where(:member_id => session[:user_id], :friend_id => params[:id]).first.destroy
  else
    Friend.new({:member_id => session[:user_id], :friend_id =>params[:id].to_i}).save
  end
  redirect_to :action => 'show', :id => params[:id]
end

Friend.where(:member_id => session[:user_id], :friend_id => params[:id]).first返回第一个(如果你是正确的话),只返回对象

希望这有帮助

答案 1 :(得分:0)

我认为你是对的,不需要.each。我的Rails 2.3提供.destroy_all,它返回它所销毁的内容:

def friend
  friend_params = { :member_id => session[:user_id], :friend_id => params[:id] }

  if Friend.destroy_all(friend_params).empty?
    Friend.new(friend_params).save
  end

  redirect_to :action => 'show', :id => params[:id]
end

因此,如果您找不到要销毁的朋友,请添加朋友。