2013-07-08 5 views
0

Railscast #223Railscast # 223: извлечение данных из базы данных

В 6:30 в этом RailsCast он упоминает реальные данные будут использоваться вместо произвольных данных.

Строка в файле /app/views/orders/index.html.erb

data: [1, 2, 5, 7, 3] 

заменяется

data: <%= (3.weeks.ago.to_date..Date.today).map { |date| Order.total_on(date).to_f}.inspect %> }] 

В 7.30 он затем создать метод класса в модели порядка.

/app/models/order.rb

class Order < ActiveRecord::Base 
    def self.total_on(date) 
    where("date(purchased_at) = ?",date).sum(:total_price) 
    end 
end 

Я не понимаю, как это получает реальные данные. Как это делается из базы данных? Он много раз ссылается на таблицу заказов, но я не вижу, где это делается.

Спасибо за чтение.

ответ

1

В коде представления он отображает последние три недели стоит дат в результате

Order.total_on(date)

Метод Order::total_on вызывает where, который является методом запроса ActiveRecord, который добавляет условие запроса (см. http://guides.rubyonrails.org/active_record_querying.html#conditions).

Поскольку в контексте метода Order::total_on, self относится к классу Order, что мы на самом деле делаем здесь запрос:

Order.where("date(purchased_at) = ?", date)

Теперь, когда на самом деле возвращает ActiveRecord::Relation объект, который позволяет связать с ним дополнительные методы запроса перед выполнением запроса. Затем мы вызываем #sum на это отношение (http://api.rubyonrails.org/classes/ActiveRecord/Calculations.html#method-i-sum) для дальнейшего преобразования запроса. Сгенерированный SQL будет выглядеть примерно так:

SELECT SUM(orders.total_price) AS sum_id FROM orders WHERE (date(purchased_at) = #{date}); 

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

(Edit в случае, если я предполагаю, что слишком много:. Фактическое соединение между Order класса и orders таблицы в базе данных производится с самой первой линии app/models/order.rb, где класс наследуется от ActiveRecord::Base ActiveRecord делает много магии - см. http://api.rubyonrails.org/files/activerecord/README_rdoc.html для базового введения.)

+0

Спасибо за руководство. Это было следствием работы ActiveRecord, которая отсутствовала в понимании всей картины. – LogiKal

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