2012-02-27 20 views
1

私は書き込みたい機能を持っていて、それがどのように機能するかは分かりません。最初の行は自分のステップを順番に返し、2行目はコースのすべてのステップで最後に一致するステップを返すようにします。私は近くにいると思うが、私が間違ったことを知る必要がある。コースは以下のモデルごとに、多くのステップを持っている多くのコンポーネントを持っていコレクションの最後に一致するレコードを見つける

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 

今、クエリはそうのように正しく生成されます:あなたが知っている1、あなたがない1:

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

は、次の2つの問題を抱えています。最初の、最も明白な問題は、clyfeがあなたのために解決したSQL構文エラーです。

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

はあなたにそのidcourse_steps_in_orderにあり、一つでも実行からに同じ結果を生成することは保証されません最後のステップを与えることを保証するものではありません。第二の問題は、INはので、この特定の順序を保証するものではないということです次の特定の順序で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 =>:destroy do def for_course(コース) join(:steps => {:component =>:course})。ここで( "courses.id =?"、コース)。 end end また、ユーザーhas_many:completed_steps、:through =>:user_steps、:source =>: – Norto23

関連する問題