2010-12-03 7 views
0

쿼리를 필터링하는 데 사용되는 양식이 있습니다. 양식 속성 중 일부는 선택 사항입니다. 나는 단지 액티브 레코드 조건을 설정 값이있는 경우에만 추가하는 방법에 대해 궁금한가요?Rails Newbie : activerecord에 조건을 추가 하시겠습니까?

상당수가 있으므로 가능한 값의 패턴마다 별도의 쿼리를 작성하지 않을 것입니다. 어떤 제안?

people = People.paginate(
    :all, 
    :include => [:people_postcodes, :people_specialties, :people_states], 
    :conditions => ["people_specialties.people_type_id = %s AND (people_postcodes.postcode_id = %s OR people_states.state_id = %s)" % [self.people_type_id, postcodeid.id, stateid]], 
    :page => page, 
    :per_page => 16 
) 

가 어떻게 최고의 옵션 '국적'속성이 채워 경우에만 별도의 조건 ('국적'을 말한다)을 만드는 방법에 대해 갈 것 :

는 구체적인 예를 부여하려면?

답변

2

처음에는 조건이 약간 불안합니다. 당신은 사이트 사용자가 원하는 악의적 인 SQL을 주입 할 수있는 기본적인 루비 텍스트 대체를하고 있습니다. 대신,이 같은 포맷 :

people = People.paginate(
    :all, 
    :include => [:people_postcodes, :people_specialties, :people_states], 
    :conditions => ["people_specialties.people_type_id = ? AND (people_postcodes.postcode_id = ? OR people_states.state_id = ?)", self.people_type_id, postcodeid.id, stateid], 
    :page => page, 
    :per_page => 16 
) 

를 귀하의 질문에 대답하기 위해, 레일 2.x 또는 3.0의 다른 조건에 압정으로하는 자연적인 방법이 없다 나는 이런 짓을 했을까 :

conditions = ["people_specialties.people_type_id = ? AND (people_postcodes.postcode_id = ? OR people_states.state_id = ?)", self.people_type_id, postcodeid.id, stateid] 

if params[:nationality] 
    conditions.first += " and nationality = ?" 
    conditions.push params[:nationality] 
end 

people = People.paginate(
    :all, 
    :include => [:people_postcodes, :people_specialties, :people_states], 
    :conditions => conditions, 
    :page => page, 
    :per_page => 16 
) 

을 위의 예에서, 나는 국적이 매개 변수로 전달되어 가정하지만, 필요에 따라 조정하고 있습니다. 원래 조건 배열을 만든 다음 첫 번째 요소 (실제 조건 문자열)를 추가하고 배열 끝에 하나 이상의 요소를 추가합니다. 국적 값.

도움이 되었기를 바랍니다.

+0

SQL 인젝션 정보. "위험한 코드"라는 태그 (?)가있어 초보자 (그리고 일부 명품 사용자)가 코드가 "위험한"것을 알 수 있기를 바랍니다. – Zabba

+0

완벽한 - 많은 감사합니다. 또한 : arghh - 나는 문자열이 SQL에서 자동으로 이스케이프 된 것으로 생각했다; 나는 그것을 놓친 것을 싫어한다. 나는 방금 다른 사람들의 소스 코드를 살펴 봄으로써 레일을 배웠다. 그러나 이것은 보안 문제 (처음 1 달 동안 attr_accessible을 알지 못함)를 놓친 두 번째 시간이다. 나는 레일 보안 문제에 대한 확실한 목록을 찾기 위해 고심하고 있으며, 나는 더 많이 놓치고 있다는 것에 조금 걱정이된다. 일반적인 레일 보안 문제에 대한 개요를 어디서 찾을 수 있습니까? – PlankTon

관련 문제