about ruby on rails...

4: Перенос поиска в модель

In asciicasts-ru on Декабрь 6, 2009 at 16:51

Упростите ваши контроллеры и устраните дублирование кода путем перемещения методов поиска из контроллеров в модели. Используйте ассоциации для вызова пользовательских методов поиска.

Оригинальный Railscast
Оригинальный Asciicast

Мы имеем модель Task и выполняем find над этой моделью:

class TaskController < ApplicationController  
  def index  
    @tasks = Task.find_all_by_complete_(false, :order => "created_at DESC")  
  end  
end

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

@tasks = Task.find_incomplete

в контроллере. Для этого мы должны определить новый метод в модели. Метод должен быть методом класса и должен начинаться с self.

class Task < ActiveRecord::Base  
  belongs_to :project  
  
  def self.find_incomplete  
    find_all_by_complete_(false, :order => "created_at DESC")  
  end  
end

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

class ProjectsController < ApplicationController  
    def show  
        @project = Project.find(params[:id])  
        @tasks = @project.tasks.find_incomplete  
    end  
end
Реклама

Добавить комментарий

Заполните поля или щелкните по значку, чтобы оставить свой комментарий:

Логотип WordPress.com

Для комментария используется ваша учётная запись WordPress.com. Выход /  Изменить )

Google+ photo

Для комментария используется ваша учётная запись Google+. Выход /  Изменить )

Фотография Twitter

Для комментария используется ваша учётная запись Twitter. Выход /  Изменить )

Фотография Facebook

Для комментария используется ваша учётная запись Facebook. Выход /  Изменить )

Connecting to %s

%d такие блоггеры, как: