Что такое метод find (x) Rails ActiveRecord, эквивалентный области отложенной проверки Как реорганизовать ActiveRecord Finder? - PullRequest
3 голосов
/ 26 мая 2011

Является ли метод Rails 'find (x) для модели ленивым?Если нет, что эквивалентно?

Я новичок в Rails, поэтому я обнаружил, что пишу такие области:

class Course < ActiveRecord::Base
  scope :by_instructor_id, lambda { |instructor_id| where(:instructor_id => instructor_id) }
  scope :by_course_template_id, lambda { |course_template_id| where(:course_template_id => course_template_id ) }
  scope :by_company_id, lambda { |company_id| joins(:instructor).merge(CompanyUser.by_company_id(company_id)) }
end

Это не много работы, но сейчасСпрашиваю себя ... если бы Rails предоставил им область видимости, мне не пришлось бы их писать.

Итак, Rails предлагает их?Могу ли я сделать что-то вроде приведенного ниже кода и заставить его выполнять только один вызов базы данных?

Company.find(params[:id]).instructors.courses

вместо

Course.by_company_id(params[:id])

Что правильно?Я знаю, что Course.by_company_id(params[:id]) - это только 1 вызов базы данных.Это очень знакомо для написания SQL или запросов в Hibernate.Но если вы можете написать по-другому, может быть, стоит?

Однако я не хочу писать Company.find(params[:id]).instructors.courses, если это приведет к более чем одному вызову базы данных.Хотя я вижу преимущество, потому что это означает, что мне никогда не придется писать 3 области, которые я показал вам выше, но я беспокоюсь, что Company.find(x) не ленив.Это так?

Ответы [ 2 ]

0 голосов
/ 26 мая 2011

Чтобы сделать find по запросу id ленивым, вы можете добавить новый метод в свой контроллер, а затем добавить этот метод в качестве помощника.

# company
def company  
  @company ||= Company.find(params[:id])  
end  
helper :company

#view
<%= company.name %>

Чтобы получить больше информации, вы можете проверить отличный RailsCast - Достойная экспозиция

0 голосов
/ 26 мая 2011

Попробуйте использовать метод #scoped на модели перед вызовом #find:

user = User.scoped.instructors.courses.find(params[:id])
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...