0

在我的红宝石模型中,我与模型“搜索”有一个 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

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

4

2 回答 2

2

exists?不需要ActiveRecord::Base对象,它需要一个 ID(或 ID 列表等,请参阅API 文档以获取更多信息。

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

searches.exists?(search.id)

而不是:

searches.exists?(search)
于 2012-04-05T09:46:59.833 回答
1

尝试:

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

或者

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

已编辑

我不确定 100%,但如果存在,它需要 id 或一些值:

exists?(id = false) 

但在 include 的情况下,它也需要 key 或 object :

include?(key) 

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

于 2012-04-05T10:42:50.627 回答