0

我想知道在创建对象之前检查对象是否存在的最佳方法是什么?

我想存储搜索查询,但如果数据库中已经有一个,那么每次都创建一个新查询是没有意义的。我宁愿增加一个计数器以获取有关最常见查询的统计信息。

我最大的问题是如何检查对象是否已经在基础中。我想知道是否有一些神奇的功能可以在不拉出整个表格并检查其中一个对象是否等于新对象的情况下进行检查?

此外,它确实必须在表单上find_or_create( myObject )并检查所有属性是否相同(每个查询对象我都有很多)并且id当然忽略。

所以这意味着我不能使用find_or_create_by_region_id_and_departement_id_and_other_attr

啊,我正在使用 Rails 3.2.6 :)

知道怎么做吗?

编辑以添加搜索查询的表结构:

# == Schema Information
#
# Table name: search_queries
#
#  id                 :integer(4)      not null, primary key
#  region_id          :integer(4)
#  departement_id     :integer(4)
#  ville              :string(255)
#  environnement_id   :integer(4)
#  etoiles_min        :integer(4)
#  etoiles_max        :integer(4)
#  tente              :boolean(1)
#  caravane           :boolean(1)
#  campingcar         :boolean(1)
#  mobilhome          :boolean(1)
#  chalet             :boolean(1)
#  bungalow           :boolean(1)
#  yourte             :boolean(1)
#  roulotte           :boolean(1)
#  tipi               :boolean(1)
#  autres             :boolean(1)
#  wifi               :boolean(1)
#  restaurant         :boolean(1)
#  epicerie           :boolean(1)
#  depotpain          :boolean(1)
#  laverie            :boolean(1)
#  espace_aqua        :boolean(1)
#  club_enfant        :boolean(1)
#  multisport         :boolean(1)
#  loc_velo           :boolean(1)
#  acces_pmr          :boolean(1)
#  animaux            :boolean(1)
#  naturiste          :boolean(1)
#  l_campingqualite   :boolean(1)
#  l_qualitetourisme  :boolean(1)
#  l_tourismehandicap :boolean(1)
#  l_ecotourisme      :boolean(1)
#  l_normandiequalite :boolean(1)
#  l_ancv             :boolean(1)
#  created_at         :datetime        not null
#  updated_at         :datetime        not null
#
4

4 回答 4

3

first_or_create/first_or_initialize如果没有对象,您可以使用它来创建对象。

query = Query.where(...).first_or_initialize

#do something with the query (increment counter, store parameters)

query.save!
于 2012-08-02T15:03:46.450 回答
0

在验证现有记录方面,Rails 幸运地支持了许多甜蜜的交易。

像其他人建议的那样,有一种存在方法,您可以将其应用于要检查的数据。

validates_uniqueness_of 也能够验证整个记录。

我个人最喜欢 find_or_create 方法,它甚至可以与更多参数链接。

玩得开心!

于 2012-08-02T15:07:33.633 回答
0

因此,由于该Model.where方法不接受对象,而只接受哈希,并且此哈希不得包含 id 字段,因此您需要使用的是:

@query = SearchQuery.where( queryObject.instance_values["attributes"].except("id")      ).first_or_create

其中 queryObject 是您需要检查是否存在的对象

谢谢你的帮助 davidrac :)

尽管我对 Rails 没有内置此功能感到有些失望,但我的意思是,很多任务比其他任何地方都快,而不是这个?

于 2012-08-03T09:44:38.720 回答
0

执行此操作的最佳方法是使用exists? 查看获取更多信息。

于 2013-12-26T20:19:38.143 回答