2013-08-29 3 views
0

내보기에 항목 목록을 표시하고 있습니다. 내 컨트롤러 클래스는 목록을 가져 오기 위해 SQL을 실행합니다. 또한 일단 가져온 경우 목록에서 일부 값을 업데이트합니다. 문제는 select 문 앞에 값이 설정된다는 것입니다. @orders에서 검색Ruby에서 SQL 명령 실행 순서

@orders = List.select("itemname,tableno,quantity,itmstatus").where(:tableno => "01") 
List.where(:tableno => "01").update_all(:ordstatus => 'displayed',:itmstatus => 'displayed') 

내보기에는 다른 필드 : 다음은 컨트롤러 코드입니다. 이제 itemstatus 값을 기반으로 내보기에서 텍스트 색상 코드를 설정해야합니다. 그래서 일단 select 문이 실행되면 itmstatus 값을 다른 값으로 설정합니다. 그러나 내 견해로는 @orders에 업데이트 된 값이 있습니다 (선택 후 수행). 나는 서버 측에서 체크했고 select 문은 업데이트 된 값 다음에 실행되었다. @orders에 업데이트 된 값을 가지고 있을지도 모른다. select 후에 update 문을 실행할 수있는 방법이 있습니까? 나는 아래에서 시도했다. 그리고 다른 옵션 그러나 두 개의 운 없음의 커플.

if @orders 
@orders = List.select("itemname,tableno,quantity,itmstatus").where(:tableno => "01") 
List.where(:tableno => "01").update_all(:ordstatus => 'displayed',:itmstatus => 'displayed') 
end 

알려 주시기 바랍니다. 감사.

답변

2

코드 @orders = List.select("itemname,tableno,quantity,itmstatus").where(:tableno => "01")인데 느리게으로 평가되는 경우보기에서 @orders 인스턴스 변수를 열거합니다. 즉, 뷰가 렌더링 될 때 실제로 평가되는 것 (SQL이 실행 됨)은 ActiveRecord::Relation입니다.

나중에이 쿼리 문을 완전히 실행하고 모든 행을 검색하지 않도록하는 한 가지 방법은 ActiveRecord::Relation에서 to_a을 호출하는 것입니다. 당신은 다음 페이지 매기기에 미나리를 사용하는 일반 미나리 페이지 매김 확장이 주어질거야-일 Kaminari::paginate_array를 사용하지 않을 경우 피려

@orders = List.select(...).where(...).to_a 

한 가지입니다.

쿼리에서 잠재적으로 많은 수의 레코드를 반환 할 수있는 경우를 고려해야합니다. to_a을 호출하면 ActiveRecord에 모든 레코드를 동시에 불러 와서 성능을 떨어 뜨릴 수 있습니다.

레일 3에서는 .all 메소드 (예 : List.select().where().all)를 사용하여 쿼리를 실행하고 평가할 수 있습니다.

이 될 레코드를 원인 : 당신이 ActiveRecord::Relation#load 방법을보고 할 수 있습니다, 그러나, 레일 4, Model.all 지금 Model.scoped에 해당하고 유유히 .to_a


또는 따라서, 평가 아직로드되지 않은 경우 데이터베이스에서로드됩니다. 실제로 사용하기 전에 어떤 이유로 명시 적으로 일부 레코드를로드해야하는 경우이 값을 사용할 수 있습니다. 반환 값은 관계 자체가 아니라 레코드입니다.

물론 실제로 사용한 적이 없지만이 경우 더 적절할 수 있습니다.

+0

감사합니다. .to_a는 일했다. 내 쿼리에는 최대 10 개의 행이 있으므로 성능 현명한 문제는 아닙니다. 자세한 설명을 위해 다시 한 번 감사드립니다. 이것은 많은 도움이됩니다. – Gaurav