2009-06-09 5 views
0

드롭 다운 메뉴가 추가 될 때 조건을 추가하는 Rails 응용 프로그램에서 SQL 쿼리를 만들고 싶습니다. 드롭 다운을 선택하지 않으면 빈 상태로 검색하고 싶지 않습니다. SQL 문에서 동적 조건을 어떻게 만들 수 있습니까?ActiveRecord는 SQL 문에서 동적 조건을 지원합니까?

안된 예 :

드롭이 선택되지 않은 경우 : Object.find를 ("빌리,"상태 => {})

드롭 선택한

: Object.find ("빌리" 조건은 => { "LAST_NAME =>"존슨은 "})

는 귀하의 의견 주셔서 감사합니다! 어쩌면이

+0

Ruby 자체가 SQL을 사용하지 않고 레일스에 대해 묻습니다. ActiveRecord 특정 :-) –

+1

ActiveRecord를 사용하는 경우 Object는 모델에 적합한 이름이 아닙니다. Ruby의 핵심 클래스. 제네릭을 사용하려는 경우 모델 또는 방법을 시도해보십시오. # 2 - Thing.find ("billy", : conditions => {etc ..})는 실제로 작동하지 않습니다. 어떻게 든 "빌리 (billy)"라는 ID 열을 가지게 설정했다면 조건이 필요없는 Thing.find ("빌리")라고 말할 수 있습니다.조건을 사용하고 있다면 일반적으로 Thing.find를 원합니다. : conditions => {etc ..} 또는 Thing.find : all, : conditions => {etc ..}. 아래에는이 문제로 인해 실행되지 않는 훌륭한 대답이 나와 있습니다. – austinfromboston

+0

@austinfromboston 나는 동의한다. 그러나 나는 그가 단지 그것을 예로서 사용하고 있었고, 실제로 그 클래스를 사용하고 있지 않다는 느낌이 들었다. 적어도 나는 그 클래스를 사용하지 않기를 바란다 ... –

답변

1

?

Object.find("billy", :conditions => last_name.nil? ? {} : {:last_name => last_name}) 
5

잘 모르겠지만이를 달성하는 일반적인 방법은 드롭 다운의 값 (보이는 텍스트가 아님)을 선택하려는 개체의 ID로 지정하는 것입니다. 당신은 선택이없는 경우에 당신은이 같은 것을 사용할 수 있습니다

last_name = unless params[:object][:last_name] 

conditions = [] 
conditions << "last_name = ?" unless last_name.blank? 
conditions << last_name unless last_name.blank? 

Object.find("billy", :conditions => conditions) 

체크 아웃 this link보다 약 ActiveRecord::Base.find() 방법과이를 사용하는 적절한 방법을 배울 수 있습니다. 또한 this great guide을보고 SQL 주입 공격으로부터 자신을 보호하는 방법을 알아보십시오.

편집 1 : 수정 된 코드가 깨끗해야합니다. 이 방법은 또한 별도의 조건을 쉽게 추가 할 수 있다는 장점이 있습니다. "something =?" 연관된 값 (param)을 추가하기 전에.

편집 2 :select form helper을 본 적이없는 경우 드롭 다운에 사용할 수 있습니다. 인생을 훨씬 편하게 해줍니다 :-)

+0

내가 훔 쳤을 때 나는 몰라. " last_name =>? " 코드에서 수정하거나 질문에서 수정하십시오. 어느 쪽이든 나의 증거 읽기는 짜증나! 그것을 지적 주셔서 감사합니다. –

+0

Lol, 우리 둘 다 원래 코드를 보았을 것입니다. –

3

컨트롤러에 #find가 있고 그 값이 params의 항목으로 들어간다 고 가정하면 (그렇지 않으면 변경해야한다고 생각합니다!) 그런 다음해야합니다. 이런 식으로 뭔가를 할 수 :

if params[:last_name] # or whatever it's actually called 
    Object.find("billy," :conditions => {'last_name = ?', params[:last_name]}) 
else 
    Object.find("billy") 
end 

당신은 당신이 named_scope까지 그 논리를 이동할 수있는 액티브의 합리적 최신 버전 (2.1 아마도 2.0을해야한다)를 사용하는 경우 :

class Object < ActiveRecord::Base 
    named_scope :for_last_name, lambda { |nm| { :conditions => nm.nil? ? {} : { last_name => nm } } 

그런 다음 컨트롤러가 작동합니다. 아래

+0

그는 그 사람이 내 코드를보고 "last_name =>을 사용 했어야합니까?" "last_name =?"대신. 미안 해요, 내 고정 : –

+0

동적 조건을 처리 할 때 named_scopes 사용에 동의했습니다. – Scott

0

나는 그것에 대해 SmartTuple 사용하고

Object.for_last_name(params[:last_name]) 

(모든 다소 안된) (우리는 얇은 컨트롤러를 좋아한다). 간단하지만 "조건 조건"을 구축하는 체계적인 접근 방식을 제공합니다.

관련 문제