2016-03-19 20 views
1

Her biri 1, 2, 3 veya -3105 (yukarıdakilerden hiçbiri için) gibi bir değere sahip olan bir dizi özelliğe veya yanıta sahip bir TraitQuestion modelim var. Harici bir API için gerekli olduklarından bu değerleri değiştiremiyorum.Rails SQL'e Göre Sipariş Ver

Ben değeriyle bunları sipariş etmek istiyorum, ama bunu yaparken, -3105 ile cevabım "Yukarıdakilerin hiçbiri" diyor rağmen üst katında görünür:

Answer 4 = -3105 
Answer 1 = 1 
Answer 2 = 2 
Answer 3 = 3 

Herhangi

@trait_question.traits.order('CASE WHEN value AS int > 0 then 1 ELSE 0 END') 
: Bu

1 
2 
3 
-3105? 

Ben SQL için oldukça yeni ama ben böyle bir şey yapmak mümkün olmalıdır gibi görünüyor ki bu sipariş verebilir nasıl fikri

Fakat bu işe yaramıyor. Siparişi nasıl ayarlayabileceğime dair herhangi bir fikir, bunları doğru sırada sipariş edebilecek şekilde SQL'i çağırır mı?

DÜZENLEME: Bu Amazon AWS aracılığıyla Postgresql 9.4.1 olduğunu

+0

bu şekilde '@ trait_question.traits.order ('VAKA deneyebilirsiniz ZAMAN değeri int AS> 0 sonra değeri BAŞKA değer * (- 1) END ') ' –

cevap

4

deneyebilirsiniz Sizin için çalışacak ya da değil, ama şunu deneyin:

@trait_question.traits.order('ABS(value)') 

ABSABS, negatif değeri pozitif olarak değiştirecek ve her seferinde mutlak değeri alacaktır. veritabanı alanı string ise onun için çalışmış Tom önerdiği gibi o zaman böyle yapabilirsiniz:

@trait_question.traits.order('ABS(CAST(value AS int))') 
+0

iyi deneyin ama şans yok :) –

+0

Yukarıdaki işler benim için postgres 9.1 Ayrıca, şu deneyebilirsiniz: '@ trait_question.traits.order (' @ value ')' @ postgres mutlak için shorthand. –

+0

Bu benim sorun oldu benim sütun bir dize, böylece ek bir 'CAST' eklemek zorunda kaldı bu yüzden @ trait_question.traits.order ('ABS (CAST (değer AS int))' çalıştı! –

1

Hey sen bunu bilmiyorum bu yolu

@trait_question.traits.order("CASE WHEN (value AS integer > 0) THEN value ELSE (value As integer)*(-1) END") 

Diğer akıllı kullanımını

@trait_question.traits.order("abs(value AS integer)") 
+0

Maalesef' PG :: UndefinedFunction: ERROR: operatör mevcut değil: karakterde değişiklik var> tamsayı LINE 1: ... rait_question_id "= $ 1 ÖDENEN VARSA (değer> 0) SONRA ... Bu –

+0

hatası ile hangi veritabanı kullanıyorsunuz? mükemmel bir şekilde çalışıyordu. "mysql" –

+0

postgresql> Amazon AWS –

0

ben tam olarak bunu yapmaya çalışıyorum emin değilim. ve normal bir yorum yapamıyorum, ama bunu deneyeceğim.

çalıştırmak, sizin projekt klasör vadede rails dbconsole

gidin ve sadece tüm olası değerleri istiyorsanız, size değeri tarafından sipariş edilen tüm girdileri vermek

SELECT * FROM traitquestions ORDER BY value 

Bu schould yürütebileceği

SELECT value FROM traitquestions ORDER BY value GROUP BY value 

Çalışıyorsa, yalnızca bir yöntem oluşturabilirsiniz

def get_values 
    find_by_sql "SELECT value FROM traitquestions ORDER BY value GROUP BY value" 
end 

ve denetleyici bu çağrı (ya da nereye kadar istediğiniz)

İlgili konular