Не могу воспроизвести (1 к 1) Mysql запрос в Rails - PullRequest
0 голосов
/ 27 апреля 2020

Я пытаюсь воспроизвести запрос поиска mysql в коде модели rails (AR). Я попытался несколько сообщений в inte rnet, но ни один из них не работал для меня.

Вот запрос mysql:

SELECT id, title, content, created_at, match(title) against ('alpha' in natural language mode) AS score FROM users.hubspot_blog_posts where match(title) against ('alpha' in natural language mode) order by score desc, created_at desc;

Идея состоит в том, получить все заголовки, которые соответствуют шаблону поиска, и упорядочить их сначала по количеству баллов, а затем (если счет равен) по дате созданного_атта.

Хотя приведенный выше запрос работает, как я хочу, я не смог переведите это в код рельсов. Вот что я попробовал, я получаю ту же коллекцию, но с другим oredre:

HubspotBlogPost.select("*, MATCH(title) AGAINST ('alpha' in natural language mode) AS score").where("MATCH(title) AGAINST('alpha' in natural language mode)", :order => "score desc, created_at desc")

С Mysql, если score идентичен, заказ выполняется по дате ( made_at), но код ruby не волнует.

Пожалуйста, исправьте меня и, если возможно, дайте мне знать, где я ошибаюсь?

1 Ответ

0 голосов
/ 27 апреля 2020

Order by - не вариант для where(), это отдельный метод.

HubspotBlogPost.select(
  "*, MATCH(title) AGAINST ('alpha' in natural language mode) AS score"
).where(
  "MATCH(title) AGAINST('alpha' in natural language mode)"
).order(
  "score desc, created_at desc"
).to_sql

возвращает

SELECT *, MATCH(title) AGAINST ('alpha' in natural language mode) AS score FROM "customers" WHERE (MATCH(title) AGAINST('alpha' in natural language mode)) ORDER BY score desc, created_at desc

Это можно сделать, чтобы выглядеть немного лучше и безопаснее избегая прямого SQL.

HubspotBlogPost.select(
  HubspotBlogPost.arel_table[Arel.star],
  "MATCH(title) AGAINST ('alpha' in natural language mode) AS score"
).where(
  "MATCH(title) AGAINST('alpha' in natural language mode)"
).order(
  'score desc', created_at: :desc
).to_sql

Последнее необработанное sql также можно удалить с помощью Arel, но это немного сложнее. Посмотрите на это, если вам интересно.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...