about ruby on rails...

3: Поиск через ассоциации

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

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

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

В этом приложении имеется модель Project связанная ассоциацией has_many с моделью Task (следовательно модель Task связана с моделью Project ассоциацией belongs_to).

Модель Project:

class Project < ActiveRecord::Base  
    has_many :tasks  
end

Модель Task:

class Task < ActiveRecord::Base  
    belongs_to :project  
end

В действии show ProjectsController мы хотим отобразить Project с конкретным id, а так же все незавершенные задачи по данному проекту. Для этого мы используем find на модели Task: ищем все задачи у которых project_id совпадает с id текущего Project и атрибут complete равен false:

class ProjectsController < ApplicationController  
    def show  
        @project = Project.find(params[:id])  
        @tasks = Task.find(:all, :conditions => ['project_id = ? AND complete = ?', @project.id, false])  
    end  
end

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

@tasks = Task.find(:all, :conditions => ['project_id = ? AND complete = ?', @project.id, false])

на следующую:

@tasks = @project.tasks.find(:all, :conditions => [complete = ?', false])

Таким образом мы исключили project_id из условий поиска, воспользовавшись поиском через ассоциацию.

Строка кода указаная выше может быть сокращена за счет использования динамического метода find_by:

@tasks = @project.tasks.find_all_by_complete(false)
Реклама

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

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

Логотип WordPress.com

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

Google+ photo

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

Фотография Twitter

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

Фотография Facebook

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

Connecting to %s

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