2012-02-27 5 views
1

필자가 쓰고 싶은 기능이 있으며 작동 방식을 결정할 수 없습니다. 첫 번째 줄은 내 단계를 순서대로 반환하고 두 번째 줄은 코스의 모든 단계에서 마지막으로 일치하는 단계를 반환하려고합니다. 나는 가까이 있지만 내가 잘못한 것을 알아야 할 필요가 있다고 생각한다. 코스는 아래의 모델에 따라, 여러 단계를 가지고있는 많은 구성 요소가모음집의 마지막 일치하는 레코드 찾기

ActiveRecord::StatementInvalid: PG::Error: ERROR: syntax error at or near "1" 
LINE 1: ... WHERE "user_steps"."user_id" = 3 AND (step.id in 1,2,4,8,5,... 
                 ^
: SELECT "steps".* FROM "steps" INNER JOIN "user_steps" ON "steps"."id" = "user_steps"."step_id" WHERE "user_steps"."user_id" = 3 AND (step.id in 1,2,4,8,5,3,7,6,9) ORDER BY "steps"."id" DESC LIMIT 1 

내가 오류를 얻고있다

course_steps_in_order = course.steps.sort_by(&:component_and_step_order)  
last_completed_step = current_user.completed_steps.where("steps.id in ?", course_steps_in_order).last 

...

class Course < ActiveRecord::Base 
    has_many :components, :dependent => :destroy, :order => "component_order" 
    has_many :steps, :through => :components, :dependent => :destroy 
end 

class Component < ActiveRecord::Base 
    belongs_to :course 
    has_many :steps, :dependent => :destroy, :order => "step_order" 
end 

class Step < ActiveRecord::Base 
    belongs_to :component 

    def component_and_step_order 
    component_order * 100 + step_order 
    end 
end 

답변

2

컬렉션을 추가 - 括弧 :

... 
last_completed_step = current_user.completed_steps.where("steps.id in (?)", course_steps_in_order).last 

이제 쿼리과 같이 올바르게 생성합니다

... AND (step.id in (1,2,4,8,5)) 
3

당신은 두 가지 문제가있다 : 당신이 알고 하나는 그렇게하지를. 가장 확실한 문제는 clyfe가 해결해 준 SQL 구문 오류입니다. 두 번째 문제는 IN는 특정 순서이 너무 보장하지 않는다는 것입니다 :

current_user.completed_steps.where("steps.id in (?)", course_steps_in_order).last 

당신에게 그 id course_steps_in_order에있는 마지막 단계를 제공하기 위해 보장되지도 하나 개의 수행으로 동일한 결과를 보장 할 수 없습니다 다음. 특정 순서로 SQL에서 결과를 가져 오려면 이 ORDER BY 절을 사용하여 해당 순서를 명시 적으로 지정해야합니다. 예를 들어, 난 그냥 내 PostgreSQL의 테이블 중 하나에 이런 짓을 : 당신이 5을 기대 될 때

=> select id from some_table where id in (1,2,3,4,5); 
id 
---- 
    1 
    5 
    2 
    3 
    4 

당신의 접근 방식은 당신에게 마지막으로 4을 줄 것입니다.

것은 나 자신을 반복 할 수 있도록 허용 : 관계형 데이터베이스를 기반으로 설정되어 본질적으로 정렬되지 않은, 당신은 다음 가 명확하게 ORDER BY 절에서 순서를 지정해야합니다 특정 순서로 아무것도 필요합니다. 당신이 당신의 last 전화가 유용 아무 의미 할 경우

는 당신은 .order 전화에 component_and_step_order 방법을 변환해야하고 포함하여 current_user.completed_steps.where 쿼리가.

+0

모델에서 order => "step/component_order"호출을 통해 모델에서이를 정렬합니다. 이것은 내가 원하는 주문이며, ID는 아닙니다. 이것이 당신이 말하는 문제를 해결할 것입니까? – Norto23

+0

@ bouser1188763 :'current_user.completed_steps'는 어디서나'order' 호출을 포함합니까? 그렇지 않으면 문제가 생깁니다. 모델에서 무엇을하든 상관 없습니다. in (2,1,3)은 2-1-3 순서로 행을 반환하지만 그 가정은 유효하지 않다고 가정하고 있습니다. –

+0

네, 지금은 보았습니다, 그들이 만들어 졌을 때 순서에 따라 명령을 내 렸습니다. 그래서 그들은 순서대로 단계를 진행해야만합니다. 이것은 작동 할 것입니다. 사용자 has_many : user_steps, : dependent => : 파괴 do def for_course (코스) 조인 (: step => {: 구성 요소 => : 코스)). 여기서 ("courses.id =?"코스).위해 다음 ("created_at") 끝 끝 또한 사용자 -> has_many : completed_steps : 통한 => : user_steps : 소스 => : 단계 – Norto23