При использовании Scope, когда следует использовать хеш-нотацию против строки? - PullRequest
1 голос
/ 16 сентября 2011

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

Пример из документации по рельсам:

scope :dry_clean_only, joins(:washing_instructions).where('washing_instructions.dry_clean_only = ?', true)

Это также может быть записано как:

scope :dry_clean_only, joins(:washing_instructions).where(:washing_instructions => { :dry_clean_only => true })
  • Как вы выбираете, какой использовать?
  • Есть ли производительность последствия?
  • Есть ли "путь рельсов"? (Документы вроде посыпать оба обыкновения)

спасибо!

Ответы [ 2 ]

0 голосов
/ 16 сентября 2011

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

scope :plus_size, where(:plus_size => true)

и

scope :similar_name, lambda{ |name| where('name LIKE ?', "%#{name}%") }

Я беспокоюсь о том, что неправильно пишу свой SQL, поэтому чем меньше я пишу, тем лучше (например, в приведенном выше примере, который не содержит лишних% в строке).

0 голосов
/ 16 сентября 2011

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

Я готов поспорить, что разница в производительности незначительна, поскольку она преобразована в запрос SQL.Попадание в базу данных и обработка результата будут происходить там, где происходит большая часть времени обработки, и в обоих случаях будут идентичны.

Если вы хотите сравнить их, вы можете использовать тесты рельсов.

rails benchmarker "Model.joins(:washing_instructions).where('washing_instructions.dry_clean_only = ?', true)" "Model.joins(:washing_instructions).where(:washing_instructions => { :dry_clean_only => true })"
...