Найти все строки, упорядоченные методом в ActiveRecord - PullRequest
1 голос
/ 13 сентября 2009

У меня есть модель ActiveRecord с полем с именем name (в базе данных) и методом с именем collation_name (не в базе данных), который возвращает сокращенную версию имени. Класс модели похож на это:

class Foo < ActiveRecord::Base

  # ... other stuff ...

  def collation_name
    words = name.downcase.split
    if words[0] == 'the'
      words.shift
    end
    words.join(' ')
  end
end

Мое приложение используется для экспорта базы данных приложения во вторую базу данных, содержащую денормализованную версию данных, включая collation_name в качестве реального столбца. Я хотел бы использовать collation_name, чтобы упорядочить записи для отображения в представлениях приложения. Я попытался Foo.all(:order=>:collation_name), но получил ошибку «нет такого столбца: имя_связи».

Как получить список Foo записей, упорядоченных по collation_name? Нужно ли добавлять collation_name в качестве реального столбца в базе данных приложения для ActiveRecord, чтобы увидеть его при заказе? Должен ли я отсортировать код приложения после того, как ActiveRecord вернул результаты?

Ответы [ 2 ]

3 голосов
/ 13 сентября 2009

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

class Foo

  attr_accessor :name

  def initialize(name)
    self.name = name
  end

  def collation_name 
    name
  end

  def <=>(other)
    collation_name <=> other.collation_name
  end

end

# create 10 foos
foos = Array.new(10).map { |e| Foo.new(rand(100_000).to_s) }
p foos # foos are unsorted
p foos.sort # foos are sorted 

# alternative: use a closure to sort
Foo.send :remove_method, '<=>'.to_sym
p foos.sort { |a,b| a.collation_name <=> b.collation_name } # sorted again

Если вы хотите упорядочить наборы результатов с помощью ActiveRecord, вам необходимо иметь столбец в базе данных. Или

  • используйте функцию, которая выводит результат для вас (по сути, тот же код, который вы используете в Ruby) и включите его в набор результатов (например, поместив его в представление и запросив представление, используя: from)
  • вычислить данные и сохранить их в базе данных (денормализовать, как вы сказали)
1 голос
/ 13 сентября 2009

Для того, чтобы: для работы вы должны использовать столбец, который известен в запросе, созданном методом .all, или вам нужно перегрузить метод .all в вашем классе, чтобы добавить отсутствующую функциональность.

Из вашего вопроса я не уверен, как выглядит ваша база данных, поэтому неясно, для какой колонки вы могли бы использовать: order. Возможно, вам придется упорядочить результирующий массив метода .all с помощью ruby, если ожидаемый порядок не может быть достигнут с помощью sql-запроса, созданного rails.

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