Учитывая ваш вариант использования, я бы использовал условное агрегирование :
SELECT u.id, u.firstname, u.lastname
FROM users u
INNER JOIN users_meta um ON um.user_id = u.id
WHERE u.sexe = 'M'
GROUP BY u.id, u.firstname, u.lastname
HAVING MAX(um.meta_key = 'user_att1' AND um.meta_value = 1) > 0
ORDER BY u.id DESC
LIMIT 0, 20
Приятно, что вы можете добавить больше критериев для users_meta.meta_key
, просто добавив больше условия в пункте HAVING
.
Это можно сделать с помощью небольшого кусочка кода Ruby. :
fmt = "%05.2f" % cost
cost_dollars, cost_cents = fmt.split '.'
Если вы пытаетесь отформатировать долларовые значения в представлении, вы должны взглянуть на number_to_currency
в ActionView :: Helpers :: NumberHelper.
>> bd = BigDecimal.new "5.75"
>> include ActionView::Helpers
>> number_to_currency(bd)
=> "$5.75"
Что касается разбивки стоимость в долларах и центах, мой первый вопрос будет: «Почему?» Если у вас есть веская причина, и вы имеете дело с десятичными знаками в своей базе данных, вы можете сделать следующее.
>> bd = BigDecimal.new "5.75"
>> "dollars:#{bd.truncate} cents:#{bd.modulo(1) * BigDecimal.new('100')}"
=> "dollars:5.0 cents:75.0"
number_to_currency
неплохо, но может дорого обойтись; Вы можете захотеть бросить свой собственный, если вам нужно много раз его назвать.
Вы должны знать, что использование плавающей запятой для хранения валюты может быть проблематичным ( и см. ), если Вы делаете много расчетов на основе этих значений. Одним из решений является использование целых чисел для валюты и подсчета центов. Похоже, это подход, используемый плагином для денег . Другое решение заключается в использовании в вашей миграции типа decimal
, который должен работать "из коробки" для современных версий Rails (> 1.2):
add_column :items, :price, :decimal, :precision => 10, :scale => 2
(: scale
это число знаков после запятой, : precision
- это общее количество цифр.) Это даст вам объекты BigDecimal в Rails, с которыми немного сложнее работать, но не плохо.
И целочисленный, и десятичный подходы немного медленнее, чем с плавающей запятой. В некоторых местах я использую плавающие числа для валюты, потому что я знаю, что мне не нужно делать вычисления для значений в Rails, только хранить и отображать их. Но если вам нужны точные расчеты валют, не используйте поплавки.
Вместо сохранения в виде десятичной дроби, сохраните как целое число центов , Таким образом, 1 доллар хранится как 100
в базе данных.
В качестве альтернативы, если вы не возражаете против небольшого снижения производительности, проверьте «.» в значении базы данных. Если он существует, разделите его на «.» И проанализируйте части как целые числа.
sprintf is your friend here:
cost_dollars = sprintf('%02.f', cost)
cost_cents = sprintf('%.2f', cost)