Запрос с модельным методом? - PullRequest
5 голосов
/ 23 января 2012

У меня проблема с выполнением запроса только для активных объектов.У меня нет активной колонки в базе данных, вместо этого в модельной игре у меня есть следующий метод:

def complete?
  self.winner ? true : false
end

Таким образом, если у игры есть победитель, #complete? вернет true.Я хочу запросить для всех игр, которые возвращали бы false для этого метода, есть ли способ сделать это с ActiveRecord?Прямо сейчас в моем контроллере я просто звоню @games = Game.all, а затем в моих играх с частичным рендерингом, таких как:

<% unless game.complete? %>
yada yada
<% end %>

Это кажется довольно хакерским и потребует от меня написания другого частичного, если я хочудля отображения "завершенных" игр.В любом случае, мне было интересно, есть ли способ в контроллере назначать только объекты, которые возвращали бы true / false из метода модели?

Ответы [ 3 ]

8 голосов
/ 23 января 2012

А как насчет быстрого и простого метода класса?

class Game < ActiveRecord::Base
    def self.completed_games
        games = []
        Game.all.each { |game| games << game if game.complete? }
        return games
    end
end

Тогда позвоните Game.completed_games. Вы можете сделать один для неполных игр тоже. Вы также можете сделать этот метод одной строкой, но я разбил его, чтобы вы могли точно видеть, что происходит.

7 голосов
/ 24 января 2012

Поскольку winner является свойством Game, почему бы не запросить это? Вам просто нужно это:

completed  = Game.where('winner is not null')
incomplete = Game.where('winner is null')

Вы также можете сделать их Области применения , если хотите:

class Game < ActiveRecord::Base
    scope :finished,   where('winner is not null')
    scope :unfinished, where('winner is     null')
    #...
end

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

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

4 голосов
/ 29 октября 2013

вы можете сделать так

    Game.all.select{ |game| game.complete? }
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...