Минимизация запросов - сортировка результатов из модели - PullRequest
0 голосов
/ 23 февраля 2011

У меня есть client, кто has_many :tasks.Я хочу отсортировать эти задачи по отдельным переменным или хэшам, доступным на мой взгляд, в зависимости от даты их выполнения.

Я пытаюсь свести к минимуму запросы, и я знаю, что на этом этапе мне следуетвозможно, вытащить все задачи для клиента, а затем отсортировать каждую задачу в переменную.Я могу сделать это, используя метод контроллера и before_filter при загрузке действия show:

 def build_client_tasks
    @tasks = client.tasks.due
    @tasks_today = []
    @tasks_tomorrow = []
    @tasks_upcoming = []
    @tasks_later = []
    for task in @tasks
      if task.due_date <= Date.today
        @tasks_today << task
      elsif task.due_date == Date.tomorrow
        @tasks_tomorrow << task
      elsif task.due_date > Date.tomorrow && task.due_date <= 7.days.from_now.to_date
        @tasks_upcoming << task
      else
        @tasks_later << task
      end
    end
  end

Есть ли лучший / более умный способ сделать это?Это работает нормально, но что, если я хочу перезагрузить эти задачи, когда пользователь добавляет новую задачу через AJAX?Затем я вынужден продублировать этот код в моем файле * .js.erb, чтобы они были доступны при перезагрузке частичного задания.

Должен быть лучший способ.Заранее спасибо за любую помощь!

Ответы [ 2 ]

1 голос
/ 24 февраля 2011

По поводу вашего комментария: я бы не стал создавать разные ячейки базы данных.У вас должен быть только один с due_date.Затем вы делаете область с блоком, как это:

класс Task

scope :due_dated, lambda {|date| where(:due_date => date) }

end

Затем вы можете сделать что-то вроде этого:

Task.due_dated(Date.today)

Привет, Стив, ты можешь попытаться определить его в своей модели задач / клиента.

class Task < ActiveRecord::Base

named_scope :today, :conditions => { :due => Date.today }

...

end

class Client < ActiveRecord::Base

def self.tasks_due_today
    tasks.today
end 

end

и, на твой взгляд, что-то вроде этого:

<%=  @client.tasks_due_today. each do |ct| %>
<li><%=  ct.content  %>
<%end%>
0 голосов
/ 24 февраля 2011

У меня будет соблазн ввести этот логин в вашу модель задачи:

class Task < ActiveRecord::Base
  # Returns upcoming tasks in a hash in the form:
  # { :today => [ task... ], :tomorrow => [ task...], :upcoming => [ task... ], :later => [ task... ] }
  def upcoming
    due.group_by do |t|
      if t.due_date <= Date.today
        :today
      elsif t.due_date == Date.tomorrow
        :tomorrow
      elsif t.due_date <= .days.from_now.to_date
        :upcoming
      else
        :later
      end
    end
  end
end

, чтобы вы могли делать такие вещи, как client.tasks.upcoming, из любого места.Например, представление может выглядеть следующим образом:

<% tasks = client.tasks.upcoming %>
<h2>Today's tasks</h2>
<%= render :collection => tasks[:today] %>
<h2>Tomorrow's tasks</h2>
<%= render :collection => tasks[:tomorrow] %>
<h2>Next 7 days</h2>
<%= render :collection => tasks[:upcoming] %>
<h2>Later</h2>
<%= render :collection => tasks[:later] %>

В Rails 3 это будет отображать экземпляр вашего частичного _task.html.erb для каждой задачи в списке.

Точно так же вы можете вызвать этот метод из вашего .js.erb, или вы можете вернуть его как JSON из вашего контроллера, используя .to_json, а затем динамически отобразить его на стороне клиента.

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