2016-04-05 3 views
0

Что является более эффективным (или в противном случае предпочтительнее): отделить where условия запятыми, как это:Каков предпочтительный способ перечисления нескольких элементов?

previous_rsvps = Rsvp 
    .where(user_id: array_of_ids, 
    waitlist_position: nil, 
    and so on...) 

или цепь их, как это:

previous_rsvps = Rsvp 
    .where(user_id: array_of_ids) 
    .where(waitlist_position: nil) 
    and so on... 

или лучше использовать SQL Анды, как это:

query = <<-SQL 
    user_id IN (array_of_ids) 
    AND waitlist_position IS NULL 
    AND so on... 
SQL 
previous_rsvps = Rsvp.where(query) 

у меня есть некоторые ? параметров в моем запросе, если это делает никакой разницы.

+0

Это зависит от ваших требований, но я предпочитаю использовать 'sql', поскольку sql-запросы работают быстрее и меньше нагрузки на сервер, чем ORM по умолчанию. –

+0

Спасибо, респонденты. Все ответы были полезными. Приятно знать, где компромиссы лежат. -Shauna – user962915

ответ

0

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

Однако существуют случаи, когда использование синтаксиса Ruby не будет работать для более сложных запросов, например, для нетрадиционных имен таблиц, объединения нескольких моделей и т. Д. Slo, безусловно, важно знать синтаксис третьего примера.

0

Давайте используем силу ActiveRecord всякий раз, когда можем и используем первый или второй (я буду использовать их взаимозаменяемо в зависимости от читаемости, которую они мне дают).

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

0

На мой взгляд, первый вариант лучше в случае, если вы хотели, чтобы реорганизовать свой код и обойти еще несколько параметров, или более сложные запросы, например, если вам необходимо для объединения таблиц и посмотреть в совместных таблицах:

condition = { waitlist_position:nil, user: {email:"some_email"} } 
Rsvp.joins(:users).where(condition) 

Учитывая, что условие динамически генерируется где-то в другом месте. Таким образом, вы сохраняете переменную condition в месте и просто корректируете критерии где-то еще.

0

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

Rsvp.for_user(user_id) 

class Rsvp 
    scope :for_user ->(user_id) do 
    where(user_id: user_id, waitlist_position: nil) 
    end 
end 

Это добавит большей гибкости в вашу реализацию, сделает ее чистой и позволит избежать ненужного дублирования кода.

Вот очень хорошая статья относительно упомянутых идей:

http://craftingruby.com/posts/2015/06/24/say-no-to_chained-scopes.html

0

Обычно можно было бы использовать первый вариант. Class.where(attr1: "lala", attr2: "lelo")

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