когда угробить активную запись? - PullRequest
2 голосов
/ 29 августа 2009

Я не новичок в Rails, но я пока не делал ничего более сложного, чем это, поэтому мне интересно, что поделится более опытный разработчик rails:

У меня есть SQL-запрос, который объединяет около 4 таблиц в один вывод:

SELECT places.id, places.name, places.email, places.website, places.blurb, external_ratings.rating, photos.data_file_name
    FROM `scannables` 
    INNER JOIN places ON scannables.place_id = places.id
    INNER JOIN locations ON places.location_id = locations.id
    LEFT JOIN external_ratings ON scannables.place_id = external_ratings.place_id
    LEFT JOIN photos ON scannables.place_id = photos.place_id
    WHERE locations.id = 2474 AND scannables.bookdate BETWEEN '2009-08-29' and date_add('2009-08-29', INTERVAL 4 DAY)
    GROUP BY scannables.place_id
    HAVING SUM(scannables.available) >= 4
    ORDER BY SUM(scannables.available) DESC, external_ratings.rating DESC

У меня есть все взаимосвязи таблиц, определенные в различных моделях, и первоначально он извлекал различные данные только с использованием этих определенных взаимосвязей (с использованием активной записи), и он работал нормально, за исключением основного запроса, самый большой из которых был безбожно медленным. несколько индв. запросы. У меня вопрос, должен ли я сбросить Active Record в этом одном случае и использовать find_by_sql ... или я что-то упустил?

Что такое рельсовый путь?

Спасибо

Ответы [ 4 ]

11 голосов
/ 29 августа 2009

Более важно быть прагматичным, чем беспокоиться о поддержании «чистоты Rails». Я люблю именованные области, ассоциации и всю магию, которая с ними связана. Конечно, я предпочитаю запускать сырой SQL-запрос. Однако, если сложный запрос вызывает find_by_sql, я буду использовать его, не теряя сна.

Если вам нужно поддерживать несколько баз данных, вы можете использовать это в чистом подходе Rails, но это требование встречается довольно редко.

4 голосов
/ 31 августа 2009

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

Мне это нравится намного лучше ....

Place.find(:all, 
        :joins => "INNER JOIN scannables ON scannables.place_id = places.id",
        :conditions => [ "places.location_id = ? and scannables.bookdate BETWEEN ? and ?", 2474, '2009-08-29', '2009-09-02' ],
        :group => 'scannables.place_id',
        :having => 'SUM(scannables.available) >= 4')

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

Хотя ... мне интересно, есть ли способ упростить это еще? Отношение определяется между scannables и местами ... то есть has_many, принадлежит ... так почему мне все еще нужно указать INNER JOIN ON? не должен

:joins => :scannable work?

во всяком случае .. это не понравилось ...

2 голосов
/ 31 августа 2009

Использование

:joins => :scannables

должно работать (обратите внимание на множественное число), при условии, что вы установили ассоциацию Place # has_many: scannables. Опция: joins для #find принимает как строки, так и именованные ассоциации.

0 голосов
/ 29 августа 2009

Возможно, вы захотите использовать продолжение , если у вас есть несколько таких запросов. В противном случае, я согласен с JDL.

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