2012-08-02 2 views
0

개체를 만들기 전에 개체의 존재를 확인하는 가장 좋은 방법은 무엇입니까?레코드가 데이터베이스에 이미 존재하는지 확인하는 가장 좋은 방법은 무엇입니까?

검색어를 저장하고 싶지만 이미 데이터베이스에 검색어가 있으면 검색어를 새로 작성하는 것이 좋습니다. 차라리 대부분의 일반적인 쿼리에 대한 통계가 필요합니다.

가장 큰 문제는 객체가 이미 기본 상태인지 확인하는 것입니다. 나는 테이블 전체를 꺼내서 객체 중 하나가 새로운 것과 같은지 확인하지 않고 이것을 확인하는 마법의 함수가 있는지 알고 싶습니다.

또한 실제로 형식이 find_or_create(myObject)이어야하며 모든 특성이 동일한 지 (그리고 각 쿼리 개체가 많은지) 확인하고 물론 id을 무시하십시오.

그래서이 내가 find_or_create_by_region_id_and_departement_id_and_other_attr

아를 사용할 수 없습니다 내가 어떻게이 일을 레일 3.2.6 :

어떤 생각으로 일하고 있어요 의미?

편집 검색 쿼리 테이블 구조를 추가합니다 : 하나가없는 경우 객체를 생성하기 위해 first_or_create/first_or_initialize을 사용할 수 있습니다

# == 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

그래서 객체 만 해시와 id 필드를 포함 할 수 없습니다이 해시를 허용하지 않는 Model.where 방법으로, 당신은 사용할 필요가 무엇 이것이다 :

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

queryObject이 객체 인 경우 당신은 당신의 도움 :) 당신에게 davidrac 감사

의 존재를 확인해야

내가 레일이 제공되지 않는 종류의보고 실망하지만

내장, 내가 너무 많은 좋은 일들이 있습니다 뜻이 무엇보다 빠른 작업 수행 이거 아닌가?

3

.

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

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

query.save! 
+0

글쎄,이 문제는 내가 Query.where (queryObject) 할 때 TypeError : 쿼리를 방문 할 수 없다는 의미입니다. 그게 무슨 뜻인지 전혀 모르겠습니다. –

+0

관련 코드를 공유 할 수 있습니까? – davidrac

+0

'@search_query = SearchQuery.where (params [: search_query]).first_or_create' –

0

레일즈는 기존 레코드의 유효성 검사와 관련하여 다행스럽게도 다행히도 지원합니다.

다른 사람들과 마찬가지로 확인하려는 데이터에 적용 할 수있는 기존 방법이 있습니다.

또한 validates_uniqueness_of는 레코드 전체를 확인할 수 있습니다.

저는 개인적으로 find_or_create 메소드를 선호합니다.이 메소드는 더 많은 매개 변수로 연결될 수도 있습니다.

재미있게 보내세요!

+0

전체 기록을 어떻게 검증 하겠는가? 내 문제는 여기에 모든 속성을 하나씩 검증 할 여유가 없다. 내 객체를 전달하고 이미 저장되어 있는지 확인해야한다. –

+0

객체 클래스에서 validates_uniqueness_of : user_id, : question_id 등을 추가하면된다. 대량 할당에 대한 보호 수준을 설정하는 것과 마찬가지로 매개 변수별로이 작업을 수행하거나 더 깨끗하다고 ​​생각되면 고유 한 식별자를 할당하는 것이 좋습니다. – dennis

0

가장 좋은 방법은 exists? this을 참조하십시오.

관련 문제