Методы динамического поиска и условные выражения - PullRequest
2 голосов
/ 23 мая 2010
Student.find(:all, :conditions => [‘name = ? and status = ?’ ‘mohit’, 1])

Vs

Student.find_all_by_name_and_status(‘mohit’, 1)

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

1 Ответ

2 голосов
/ 24 мая 2010

Вы правы, второй путь пройдет через 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 и другими параметрами.

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