collection.exists?对我说谎

时间:2012-04-05 09:32:25

标签: ruby-on-rails ruby has-and-belongs-to-many

在我的ruby模型中,我与模型“搜索”有一个has_and_belongs_to_many关系:

has_and_belongs_to_many :searches

我想添加一个新的搜索对象,只有它尚不存在,所以我写道:

def append_unless_already_there search
  unless searches.exists?(search)
    searches << search
end

但是,添加2次新对象会通过该条件,并导致sql异常。尝试用search.id替换搜索,但不会改变任何东西。 我在代码中添加了一些日志记录:

def append_unless_already_there search
  puts ""
  puts searches.exists?(search)
  unless searches.exists?(search)
    puts "["
    searches.each do |s|
      puts s.id
    end
    puts "]"
    puts search.id

    searches << search
  end
end

添加5个搜索对象,其中最后2个相等,在添加最后一个对象时会导致以下日志记录:

false
[
12
5
8
1
]
1

当我阅读给出的文档和示例时,这最后是否存在?检查应该返回true。我无法弄清楚我在这里缺少什么。提前谢谢。

2 个答案:

答案 0 :(得分:2)

exists?不会占用ActiveRecord::Base个对象,它需要一个ID(或ID列表等,有关详细信息,请参阅API Docs

所以要测试你想要做的存在:

searches.exists?(search.id)

而不是:

searches.exists?(search)

答案 1 :(得分:1)

尝试:

(searches << search) unless searches.include?(search)

OR

(searches << search) if !searches.include?(search)

<强> EDITED

我不确定100%但是 如果存在,则需要id或某些值:

exists?(id = false) 

但是在包含的情况下,它也需要密钥或对象:

include?(key) 

有关详细信息,请查看http://api.rubyonrails.org/