2011-03-08 5 views
0
>> c = Course.find(3).course_steps.order(:position) 
=> [#<CourseStep id: 9, step_id: 4, course_id: 3, position: 1, created_at: "2011-03-08 20:57:44", updated_at: "2011-03-08 20:57:44">, #<CourseStep id: 10, step_id: 5, course_id: 3, position: 2, created_at: "2011-03-08 20:57:45", updated_at: "2011-03-08 20:57:45">, #<CourseStep id: 8, step_id: 2, course_id: 3, position: 3, created_at: "2011-03-08 20:57:42", updated_at: "2011-03-08 20:57:42">] 

Je dois trouver un course_step qui est après id 9 (qui se trouve être course_step avec id 10) (si elle est existe)Trouver Suivant et les enregistrements précédents commandés par des rails de colonne de position

Je dois aussi pour trouver la précédente (si elle existe)

Je sais que je pourrais le faire manuellement en bouclant les résultats, mais je préférerais le faire avec SQL.

La prochaine requête SQL serait:

SELECT * FROM course_steps WHERE position >=POSITION_OF_STEP ORDER BY position LIMIT 1 OFFSET 1 

La requête SQL PRÉCÉDENT serait:

SELECT * FROM course_steps WHERE position <= POSITION_OF_STEP ORDER BY position DESC LIMIT 1 OFFSET 1 

Je pense que je l'ai eu!

+0

Votre code SQL n'est-il pas simplement suivi d'un seul CourseStep avec la position> = 1? Comment cela se traduit par une requête NEXT? –

+0

Je suis juste en train de coder la position. Je voudrais avoir cette information dans le code –

+0

On dirait que vous l'avez, mais il me semble que si vous voulez NEXT ou PREVIOUS vous voulez probablement> et = et <= dans la partie position de votre clause where. Vous pouvez également transformer cela en deux fonctions rubis très simples qui pourraient être plus propres. –

Répondre

1
class CourseStep < ActiveRecord::Base 
    belongs_to :step 
    belongs_to :course 

    validates_uniqueness_of :step_id, :scope => :course_id 

    def next_step() 
    Course.find(self.course.id).course_steps.order(:position).where("position >= ?", self.position).limit(1).offset(1).first 
    end 

    def previous_step() 
    Course.find(self.course.id).course_steps.order("position DESC").where("position <= ?", self.position).limit(1).offset(1).first 
    end 
end 
Questions connexes