2011-04-06 31 views
6

Questions ve Answer modelim var ve tüm yanıtları belirli bir soruya çekiyorum.Raylar: Kayıtların yerleştirilmesini sağlayın

each_with_index numarasını kolayca bulabilir ve bir yanıtın dizininin veya "yerleşiminin" ne olduğunu anlayabilirim (söz konusu sorunun diğer yanıtlarıyla ilişkili olarak).

Ama yine de, cevabın endeksi belirli bir soru ile ilişkili tüm diğer cevaplar ile ilgili olarak ne olduğunu anlamaya nasıl ... Belirli bir cevap almak istiyorsunuz.

Örnek Answer veriler:

ID text  question_id 
23 awesome 3 
27 boooyah 3 
38 snap  3 

Cikarirsam Answer.find(27) Ben Kayıt (ı kimliğine göre emrediyorum varsayarak ... Ben herhangi bir alana göre sipariş verebilir gerçi) ikinci öğe olduğunu anlamaya nasıl.

+0

sonra sadece tablodaki bir pozisyon sütunu eklemek için pozisyon gerçekten önemli olduğunu. – corroded

+0

Ancak dinamik olması gerekiyor. Eğer 'ORDER BY created_at' yaparsam, o zaman pozisyon değiştirir. Onları belli bir düzende tutmak istemiyorum, belirli bir sırayla nerede olduklarını öğrenmek istiyorum. – Shpigford

+0

, önerdiğim gibi veritabanında pozisyonu kaydetmediğiniz sürece. Eğer pozisyonu kaydettiyseniz, boooyah her zaman konum 2'ye sahip olacaktır, sorgunuz ne olursa olsun sql 'count' daha perfomance – corroded

cevap

6
class Answer < ActiveRecord::Base 
    belongs_to :question 

    def position(column = 'id', order = 'ASC') 
    order_by = "#{column} #{order}" 
    arrow = order.capitalize == "ASC" ? "<=" : ">=" 
    question.answers.where("#{column} #{arrow} (?)", self.send(column)).order(order_by).count 
    end  
end 

Answer.find(27).position 
Answer.find(27).position("updated_at") 
Answer.find(27).position("updated_at", "DESC") 
+0

kullanarak – ctcherry

+0

evet, benim hatam. – fl00r

+0

Şimdi * bu * işe yaradı ve kabul edildi "sayıldı" daha performanslı. – ctcherry

1

Böyle bir şey işe yaramalı, test edilmemiş ama kavramı görebiliyorsunuz.

class Answer < ActiveRecord::Base 

    belongs_to :question 

    def placement(ordering_by => 'id ASC') 
    question.answers.order(ordering_by).index(self) 
    end 

end 
+0

oldu. Bu sadece id tarafından sıralama için çalışır. Başka bir şeye göre sıralama yapmak, aynı zamanda, 'nerede (' id <=? ', Self.id) 'koşulunu her zaman uyguladığınızdan ve sayımı aldıktan sonra aynı etkiye sahip olacaktır. – fl00r

İlgili konular