Выбор случайного в рельсах sqlite vs mysql - PullRequest
2 голосов
/ 11 октября 2009

Эй, ребята, я пытаюсь выбрать случайные данные из базы данных в Ruby on Rails. К сожалению, sqlite и mysql используют разные имена для «случайной» функции. Mysql использует rand (), sqlite использует random (). До сих пор я был очень счастлив использовать sqlite в своих средах разработки, и я не хочу отказываться от этого только ради этого.

Так что у меня есть решение, но я не очень доволен им. Во-первых, есть ли в RoR более чистая абстракция для получения случайной функции? И если нет, то это лучший способ получить «адаптер»?

# FIXME: There has to be a better way...
adapter = Rails.configuration.database_configuration[Rails.configuration.environment]["adapter"]
if adapter == "sqlite3"
  # sqllite calls it rand
  random = "random"
else
  # mysql calls it rand
  random = "rand"
end

query.push("SELECT *, (" +  random + "() * (0.1 * value)) AS weighted_random_value...")

Ответы [ 3 ]

8 голосов
/ 11 октября 2009

Вы можете эффективно присвоить MySQL rand() стандарту random(), создав функцию:

CREATE FUNCTION random() RETURNS FLOAT NO SQL SQL SECURITY INVOKER RETURN rand();
4 голосов
/ 23 октября 2009

Я написал небольшой плагин, который решает эту проблему:

http://github.com/norman/active_record_random

1 голос
/ 12 октября 2009

Я столкнулся с этой проблемой при локальной разработке с использованием SQLite. К сожалению, это не единственное различие между базами данных, с которыми вы собираетесь работать (например, логические значения также обрабатываются по-разному).

Требуется ли, чтобы вы поддерживали и SQLite, и MySQL? Если нет, я рекомендую переключиться на одну базу данных: ту, на которой вы развертываете в рабочей среде.

Это займет немного больше времени для настройки, но, по-моему, в долгосрочной перспективе это сэкономит ваше время, и вы будете уверены, что ваше приложение хорошо работает с базой данных, с которой вы фактически будете его развертывать.

...