2014-12-10 3 views
0

지금 Rails 3.2.13을 사용 중입니다. 레일스의 동적 조건으로 데이터를 찾는 방법은 무엇입니까?

나는이 방법을 만들어 :

def search 
    search_conditions = [] 
    search_conditions << ["id = ?", params[:id]] if params[:id] != '' 
    search_conditions << ["name LIKE ?", "%#{params[:name]}%"] if params[:name] != '' 
    @users = User.find(:all, :conditions => search_conditions) 
end 

을하지만 결과였다

undefined method `%' for ["name LIKE ?", "%tes%"]:Array 

내가 좋은 방법 여러 조건을 설정할 수 없습니다?

답변

1

뭔가 :

이전 JC 아베 나에 의해 언급 한 바와 같이
def search 
    re = Outlet.where(1) 
    re = re.where("id = ?", params[:id]) if params.has_key? :id 
    re = re.where("name LIKE ?", "%#{params[:name]}%") if params.has_key? :name 
    # chain it further as required... 

    re.all 
end 

, 그것은 레일 3 대신은 "발견의"(...) "구문 (사용하는 것이 좋습니다 : 모든 ...) "

+0

샘플을 제공해 주셔서 감사합니다. 그러나 Rails3에서'find'를 사용하지 말고'where'를 사용해야합니까? Rails3에서'where'를 사용할 때 게으른로드 문제가 아닌가요? –

+0

기본적으로 "where"는 결과 데이터 집합 대신 관계를 반환합니다. 그래서 몇 곳의 체인을 연결하는 것이 훨씬 쉽습니다. 결과를 사용하려면 관계에 대해 먼저 또는 모두 호출하십시오. "어디에서"의 유연성은 Rails 2의 "조건"보다 훨씬 높습니다. 그리고 "find"와 관련된 메소드 중 일부 (또는 많은 것)가 사용되지 않습니다. find (: all)는 Rails 4.1에서 오류 메시지를 반환합니다. – roob

1

레일즈 3.2를 사용하고 있으므로 AREL 구문을 사용하도록 전환해야합니다. 거기에 많은 튜토리얼이 있습니다. 이러한 종류의 쿼리를보다 직관적이고 간단하게 만들 수 있습니다. AREL을 사용할 때 쿼리에서 여러 where 문을 연결할 수 있습니다. 이 같은

+0

답변 해 주셔서 감사합니다. 그것은 좋은 정보입니다. '사용자 = User.arel_table @users = User.where (사용자 [: ID] .EQ (PARAMS [: ID] 불러야 (사용자 [: 이름] .matches ("%의 # {PARAMS [: 이름] 나는 이것을 만든 } % "))))'. 이제는 사용자가 조건을 선택하면 검색을하고 싶기 때문에 사용자가'id' 만 설정하면 SQL은 다음과 같이됩니다 :'SELECT COUNT (*) FROM'users' WHERE ((''users'.id' = 123456789 OR' 사용자'.name'LIKE '%%'))'. 좋지 않아. 나는 그들을 분리하고 싶다. –

관련 문제