0

У меня есть страница, которая показывает элементы в индексе.Как выбрать строки, начинающиеся с цифры в Rails?

я могу получить детали письма, используя следующие:

scope :by_letter, lambda { |letter| where("name LIKE '#{letter}%'") } 

Но я не могу понять, элегантное решение для имен, которые начинаются с цифры (0-9).

Как я могу переписать эту или отдельную область, которая позволила бы мне искать имена, начинающиеся с цифры?

EDIT: Я пытаюсь получить все строки, начинающиеся с 0-9 за один раз (не отдельно для каждого номера).

+0

Вы попробовали 'Модель .by_letter ("1") '. Он должен работать. Просто измените имя на by_character, и у вас его есть! :) –

+0

Обновлен вопросительный знак :) - Я имел в виду выборку строк, которые начинаются с цифры за один раз. – Jacob

ответ

4

это должно работать

scope :starts_with_number, where("name REGEXP '[0-9]%'") 
+0

Удивительный! намного лучше, чем мое решение ниже. Благодаря! – Jacob

+0

MySQL, похоже, работает с 'REGEXP '^ [0-9]'' – Jacob

+0

Я просто собирался сказать, что: D –

0

Вот как я в конечном итоге делает это:

@letter_merchants = [] 
(0..9).to_a.each do |digit| 
    @letter_merchants |= Merchant.by_letter(digit) 
end 
+0

просто для того, чтобы быть средним => сколько запросов будет выполняться с помощью этого кода ? – cristian

+0

Один gazillion слишком много: D – Jacob

1

Jacob, попробуйте это немного переписан версию того, что вы в конечном итоге с:

@letter_merchants = (0..9).map { |d| Merchant.by_letter(d) } 

Обратите внимание, что это должно только иллюстрировать, насколько удивительным языком является Ruby, а не как проблема должна быть решена (там будет t oo многие вызовы базы данных).

+0

Вау, это довольно здорово! Благодаря! – Jacob

0

Одним из недостатков REGEXP является то, что он не может использовать индексы. однако

scope :starts_with_number, where("name >= '0' and name < ':') 

можно использовать указатели по названию. Он полагается на символы 0-9: находясь именно в таком порядке, ничто между ними не будет иметь ничего общего с ascii, utf8, но нет, если вы использовали ebcdic или что-то такое безумное

Смежные вопросы