Я пытаюсь создать очень сложный запрос, и у меня проблемы с ним - так что я возвращаюсь к основам, чтобы попытаться что мне не хватает. Я читал Rails Guides
для Active Record Associations
и Active Record Query Interface
(в частности, section 12 - присоединяется), и я не понимаю, как они связаны и почему требуется объединение/включение.Борясь, чтобы понять, почему объединения/включения необходимы с Rails, когда существует ассоциация в модели
На странице «Ассоциации» говорится: «Благодаря ассоциациям с активной записью мы можем оптимизировать эти и другие операции посредством декларативно говорящих Rails о наличии связи между этими двумя моделями». В разделе 12.2 на странице «Запрос» говорится: «Active Record позволяет использовать имена ассоциаций, определенных в модели, как ярлык для указания предложений JOIN для этих ассоциаций при использовании метода объединения».
Эти два утверждения несколько расходятся друг с другом. Если я создаю ассоциацию belongs_to, почему мне нужно соединение, если я пытаюсь извлечь данные из обеих таблиц? Глядя на это с другой стороны:
class Customer < ActiveRecord::Base
has_many :orders
end
class Order < ActiveRecord::Base
belongs_to :customer
end
Если я @orders = Order.all
я могу выводить имя клиента, делая @orders.first.customer.name
. Однако, если я хочу выбрать все заказы с «кузнецом» в названии, я бы сделал что-то вроде @orders=Order.where('customer.name ilike "%smith%"').joins(:customer)
Как получается, что эти «отношения» работают в первом тайме, но для этого требуется объединение во второй половине?
большой описание! Вы действительно помогли устранить пробел для меня. Кроме того, эта первая статья действительно дала мне новую информацию - я никогда не понимал, как смешивать и сопоставлять все отношения. Надеюсь, это поможет мне вернуть мой запрос под контроль, и позвольте мне получить результаты, которые я ищу. :) – Ben
выполняет порядок ленивой загрузки 'select.preload (articles) .last' vs' select.last.preload (articles) '? – Ben
Да, предварительная загрузка может произойти только в области с областью. Так, например: 'User.joins (: articles) .each'. Вы должны загружать непосредственно из области действия, иначе она не удастся, возможно, с неопределенным. – fbelanger