2

여기서 첫 번째 대답에서 제안한대로 배열을 사용하여 동적으로 조건 집합을 작성하려고합니다 : One or more params in model find conditions with Ruby on Rails. 그러나 내가 뭔가 잘못하고있는 것 같아요 그리고 내가 뭘하려고하는지 근본적으로 불확실하거나 단순히 내 구문을 botching 경우 확실하지 않습니다.배열에서 액티브 레코드 조건을 빌드 - 전용 메서드 'scan'이라는 오류가 발생했습니다

저는 제가 논쟁하고있는 5 가지 조건 스타일을 겹쳐 쓰기 전에이 라인을 따라 간단한 개념 증명을 만들려고 시도하면서이 문제를 설명하기 위해 여기 하나의 조건으로 단순화했습니다.

이 작동 : 어떤 조언을

conditionsSet = [] 
excluded.push 12 
excluded.push 30 
conditionsSet << ["id not in (?)", excluded] 
@allsites = Site.all(:conditions => conditionsSet) 

감사 :

excluded.push 12 
excluded.push 30 
@allsites = Site.all(:conditions => ["id not in (?)", excluded]) 

이 개인 방법 결과라는 오류 '스캔'. 나는 적절한 것이 이것이 내가 맨 위에서 언급 한 관련 질문/답변에 대한 후속 조치 항목으로 넣었는지 확실하지 않았습니다. 문제가 대답이 아니기 때문에. 이 게시물을 게시하는 더 좋은 방법이 있다면 기존 게시물에 알려주십시오.

+0

정확한 오류는 무엇입니까? –

답변

5

이 시도

Site.all(:conditions => Site.build_conditions([1,2])) 
Site.all(:conditions => Site.build_conditions(nil, "ABC")) 

레일 3

class Site < ActiveRecord::Base   
    def self.exclude_ids_by_name_and_state(ids, name=nil, state=nil) 
    result = scoped 
    result = result.where("id NOT IN (?)", ids) if ids.present? 
    result = result.where(:name => name) if name.present? 
    result = result.where(:state => state) if state.present? 
    result 
    end  
end 
어딘가에 컨트롤러에 이제3210

:

Site.exclude_ids_by_name_and_state([1,2])).all 
Site.exclude_ids_by_name_and_state(nil, "ABC").all 
+0

이것은 절대적으로 완벽합니다. 나는 내 질문에 올린 것보다 더 실례가되는 표본을 고맙게 생각한다.이제는 조건 블록을 적절하게 빌드하고 위생 처리하는 방법을 명확히했습니다. 비슷한 것을 시도했지만 sanitize_aql_array 호출이 누락되었고 조인을 사용하여 ands로 문자열을 작성하는 기술이 사라졌습니다. 이것은 매력처럼 작동합니다. 감사합니다. (다시) 칸다다 보구! – Nick

3

당신이 원하는 :

conditionsSet += ["id not in (?)", excluded]

대신 :

conditionsSet << ["id not in (?)", excluded]

+=<<가 밀어 동안 (을 2 : 1로 배열을 병합로 생각) 함께 두 개의 배열을 추가 새로운 요소를 배열에 추가합니다. 따라서 <<을 사용할 때 [["id not in (?)", excluded]]을 얻고 :conditions은 첫 번째 요소가 문자열 (배열이 아님) 인 배열을 원합니다. 컨트롤러 어딘가에 지금

레일 2.3

class Site < ActiveRecord::Base 

    def self.build_conditions(ids, name=nil, state=nil) 
    cond = [] 
    cond << send(:sanitize_sql_array, ["id NOT IN (?)", ids]) unless ids.empty? 
    cond << send(:sanitize_sql_array, ["name = ? ", name]) unless name 
    cond << send(:sanitize_sql_array, ["state = ? ", state]) unless state 
    cond.join(" and ") 
    end  
end 

을 :

2

SmartTuple을 시도, 그것은 특별히 이런 경우를 위해 설계되었습니다. 나에게

def self.build_conditions(options = {}) 
    [ 
    SmartTuple.new(" AND "), 
    (["id NOT IN (?)", ids] if options[:ids].present?), 
    ({:name => options[:name]} if options[:name].present?), 
    ({:state => options[:state]} if options[:state].present?), 
    ].sum.compile 
end 

... 

Site.all(:conditions => Site.build_conditions(:ids => {1,2])) 
Site.all(:conditions => Site.build_conditions(:name => "abc", :state => "disabled") 

options 해시 대신의 명령 인수를 사용하는 것이보다 더 낫다입니다. 프로젝트가 성장함에 따라 더 많은 조건이 나타날 수 있으며 어떤 조건이 올지를 추적 할 수 없게됩니다. 해시 (Hash)는 더 명확 해지고 소프트웨어 오류를 피하기 위해 쉽게 검증 할 수 있습니다.

+0

SmartTuple은 내가 필요한 것만 큼 훌륭합니다. 공유해 주셔서 감사합니다. – Jurgen