виртуальный атрибут в запросе - PullRequest
1 голос
/ 03 августа 2011

Модель пользователя имеет атрибут all_scores , и я создал метод ниже

models / user.rb

def score
  ActiveSupport::JSON.decode(self.all_scores)["local"]
end

Что я пытаюсь сделать, используя эту оценку виртуального атрибута для фильтрации пользователей. Например: Мне нужны пользователи, чей счет превышает 50. Проблема в том, что я не могу использовать виртуальный атрибут как обычный атрибут в запросе.

User.where("score > 50") # i can't do this.

Любая помощь будет оценена.

1 Ответ

2 голосов
/ 03 августа 2011

Ну, самое простое решение, вероятно, будет User.all.select{|user| user.score > 50}. Очевидно, что это очень неэффективно, вытаскивая каждую запись пользователя из базы данных.

Если вы хотите выполнить запрос, связанный с оценкой, почему бы вам не добавить столбец score в таблицу пользователей? Вы можете обновить его всякий раз, когда all_scores изменяется.

class User < AR::Base
  before_save :set_score, :if => :all_scores_changed?

  protected
  def set_score
    self.score = ActiveSupport::JSON.decode(self.all_scores)["local"] rescue nil
  end
end

Это также позволит избежать постоянной десериализации данных JSON при каждом обращении к user#score.

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