Можно ли получить ActiveRecord после запуска SQL-запроса в Rails? [Дубликат]

Добавьте display: flex; к родительскому элементу. Вот решение с префиксом:

p {
  display: -webkit-box;
  display: -webkit-flex;
  display: -ms-flexbox;
  display: flex;
}
span {
  float: left;
  display: inline-block;
  width: 100px;
  background: blue;
  font-size: 30px;
  color: white;
  text-align: center;
}
<p>
  <span> Foo </span>
  <span> Bar </span>
</p>


Обновить

Упрощенная версия

79
задан Nathan 26 June 2013 в 23:59
поделиться

3 ответа

Как преобразовать массив объектов в ActiveRecord :: Relation? Предпочтительно, не делая каждый раз каждый раз.

Вы не можете преобразовать массив в ActiveRecord :: Relation, поскольку Relation - это просто построитель SQL-запроса, и его методы не работают с фактическими данными .

Однако, если вам нужно отношение:

  • для ActiveRecord 3.x, не вызывайте all и вместо этого вызывайте scoped , который вернет ссылку, которая представляет те же записи, которые all предоставит вам в массиве.
  • для ActiveRecord 4.x, просто вызовите all , который возвращает отношение.

При запуске метода типа def self.subjects в ActiveRecord :: Relation, как мне получить доступ к самому объекту ActiveRecord :: Relation?

Когда метод вызывается в объекте Relation, self является отношением (в отличие от класса модели, в котором он определен).

39
ответ дан Andrew Marshall 27 August 2018 в 08:32
поделиться

Вы можете преобразовать массив объектов arr в ActiveRecord :: Relation, как это (предполагая, что вы знаете, какой класс являются объектами, что вы, вероятно, делаете)

MyModel.where(id: arr.map(&:id))

Вы должны использовать where, но это полезный инструмент, который вы не должны неохотно использовать. И теперь у вас есть однострочное преобразование массива в отношение.

map(&:id) превратит ваш массив объектов в массив, содержащий только их идентификаторы. И передача массива в предложение where будет генерировать инструкцию SQL с IN, которая выглядит примерно так:

SELECT .... WHERE `my_models`.id IN (2, 3, 4, 6, ....

Имейте в виду, что порядок массива будет потерян - Но поскольку ваша цель состоит только в том, чтобы запустить метод класса в коллекции этих объектов, я предполагаю, что это не будет проблемой.

129
ответ дан Marco Prins 27 August 2018 в 08:32
поделиться

Ну, в моем случае мне нужно преобразовать массив объектов в ActiveRecord :: Relation, а также отсортировать их с определенным столбцом (например, id). Поскольку я использую MySQL, полевая функция может быть полезна.

MyModel.where('id in (?)',ids).order("field(id,#{ids.join(",")})") 

SQL выглядит так:

SELECT ... FROM ... WHERE (id in (11,5,6,7,8,9,10))  
ORDER BY field(id,11,5,6,7,8,9,10)

Функция поля MySQL

3
ответ дан Xingcheng Xia 27 August 2018 в 08:32
поделиться
Другие вопросы по тегам:

Похожие вопросы: