2012-08-02 81 views
0

我想知道在創建對象之前檢查對象的存在的最佳方法是什麼?檢查Rails中的數據庫中是否存在記錄的最佳方法是什麼?

我想存儲搜索查詢,但如果數據庫中已經存在搜索查詢,那麼每次創建一個新搜索查詢都沒有意義。我寧願增加一個計數器來獲得關於大多數常見查詢的統計信息。

我最大的問題是如何檢查對象是否已經在基地。我想知道是否有一些神奇的功能來檢查這一點,而不用拉出整個表格並檢查一個對象是否等於新對象?

此外,它確實必須在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 
# 

回答

0

因此,作爲Model.where方法不接受一個對象,但只有一個哈希這個哈希不能包含一個id字段,你需要使用這是什麼:

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

哪裏queryObject是對象你需要檢查的

存在謝謝davidrac的幫助:)

雖然我有點disapointed是Rails的不來與這個內置的,我的意思是有這麼多偉大的事情比其他地方的任務快得多而不是這個?

3

您可以在訂單,如果沒有一個創建一個對象使用first_or_create/first_or_initialize

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

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

query.save! 
+0

那麼這個問題是當我做Query.where(queryObject),它說我有一個TypeError:無法訪問查詢,我完全不知道這是什麼意思 – 2012-08-02 15:27:18

+0

你能分享相關的代碼嗎? – davidrac 2012-08-02 15:29:14

+0

'@search_query = SearchQuery.where(params [:search_query])。first_or_create' – 2012-08-03 07:31:45

0

當談到驗證現有記錄時,Rails幸運地支持許多甜蜜的交易。

像其他人一樣建議有一種存在的方法,你可以應用到你想檢查的數據。

也validates_uniqueness_of能夠驗證記錄作爲一個整體。

我個人最喜歡find_or_create方法,它甚至可以鏈接更多的參數。

玩得開心!

+0

您將如何驗證整個記錄?我的問題是我無法逐一驗證每個屬性,我需要傳遞我的對象並查看它是否已經存儲 – 2012-08-02 15:28:49

+0

在對象的類中,您可以添加validates_uniqueness_of:user_id,:question_id等。我會建議按照每個參數進行設置,就像爲質量分配設置保護級別一樣,或者如果您認爲這樣做更加乾淨,請指定一個唯一標識符 – dennis 2012-08-02 15:31:08

0

這樣做的最好方法是使用exists? 有關更多信息,請參閱this

相關問題