2010-05-23 2 views
2
Student.find(:all, :conditions => [‘name = ? and status = ?’ ‘mohit’, 1]) 

VsДинамических найти методы Vs условных оператор

Student.find_all_by_name_and_status(‘mohit’, 1) 

Оба запросы приведут один и тот же набор строки, но первый является предпочтительной причиной во втором пути будет исключение генерируется method_missing, а затем рельсы будут попробуйте связать его как динамический метод. если штраф, то результат будет возвращен. Может ли любой орган объяснить мне это в хорошей манере. Что именно происходит за экраном. Пожалуйста, поправьте меня, если я ошибаюсь.

ответ

2

Вы правы, второй способ пройдет через method_missing. ActiveRecord будет анализировать имя метода и, если он является допустимым именем, он будет генерировать метод «на лету».

Если посмотреть в источнике ActiveRecord::Base, в method_missing вы увидите, что разработчики оставили нам комментарий о том, как этот сгенерированный метод будет выглядеть следующим образом:

# def self.find_by_login_and_activated(*args) 
# options = args.extract_options! 
# attributes = construct_attributes_from_arguments(
#  [:login,:activated], 
#  args 
# ) 
# finder_options = { :conditions => attributes } 
# validate_find_options(options) 
# set_readonly_option!(options) 
# 
# if options[:conditions] 
#  with_scope(:find => finder_options) do 
#  find(:first, options) 
#  end 
# else 
#  find(:first, options.merge(finder_options)) 
# end 
# end 

Итак, вы видите, что в целом она сводится к тот же find способ.

Я бы не сказал, что первый способ предпочтительнее из-за method_missing, потому что штраф за исполнение для этого ничтожно мал. Второй способ читается лучше и работает хорошо, если вам просто нужно извлекать записи на основе атрибутов, равных некоторым значениям.

Однако эта вторая форма не позволяет делать что-либо помимо сравнения сравнений (например, сравнение диапазона, «не равно» выражениям, объединениям и т. Д.). В таких случаях вам просто нужно использовать метод find с соответствующими conditions и другими параметрами.

Смежные вопросы