Как использовать объединения с использованием ассоциаций в Ruby on Rails - PullRequest
0 голосов
/ 21 февраля 2012

Я пытаюсь создать плагин Redmine, построенный на Ruby on Rails.У меня есть следующий запрос, который выбирает сумму time_entries всех проблем во время счета.

SELECT SUM( t.hours ) 
FROM time_entries t
JOIN invoices i ON t.project_id = i.project_id
WHERE t.project_id = <current project id----@project.id>
AND i.id = <billing invoice id>
AND t.updated_on >  'i.created_at'
AND t.updated_on < 'i.due_date'

Как я могу сохранить эти данные запроса в столбце таблицы счетов с именем time_spent или получить результаты в представлении счетов, которыеперечисляет все счета вместе с вышеуказанным запросом по идентификатору счета

Связи в созданной мной модели выглядят так:

class Invoice < ActiveRecord::Base
  set_table_name "invoices"
    set_primary_key "invoice_id"

    belongs_to :project
    belongs_to :author, :class_name => "User", :foreign_key => "author_id"
    has_many :time_entries, :class_name => "TimeEntry", :foreign_key => "project_id"

В контроллере я называю модель как

@invoices = Invoice.find(:all, :joins=>" INNER JOIN time_entries ON time_entries.project_id = invoices.project_id",:conditions => ["invoices.project_id = ? AND updated_on > ? AND updated_on < ?", @project.id, invoices.created_at, invoices.due_date])

Я знаю, что переменная экземпляра контроллера полностью испорчена.

Где-то я ошибаюсь.Может кто-нибудь, пожалуйста, помогите мне с этим.

Ответы [ 2 ]

2 голосов
/ 21 февраля 2012

Я предполагаю, что Rails 3+ и MySQL дают каждому вашему элементу в коллекции @invoices аксессор с именем time_spent, который будет иметь сумму, которую вы ищете. Эта информация не будет сохранена в БД, но будет извлечена для вашего просмотра:

Invoice.where("invoices.project_id = ? AND invoices.updated_on > ? AND invoices.updated_on < ?", @project.id, invoices.created_at, invoices.due_date).select("SELECT invoices.*, SUM( time_entries.hours ) as time_spent").joins(:time_entries).group("invoices.id")

Я предполагаю на

Invoice.find(:all, 
:conditions => ["invoices.project_id = ? AND updated_on > ? AND updated_on < ?", @project.id, invoices.created_at, invoices.due_date],
:select=>"SELECT invoices.*, SUM( time_entries.hours ) as time_spent",
:joins=>[:time_entries],
:group=>"invoices.id")

(надеюсь, что я набрал это правильно. Если нет, суть заключается в том, чтобы использовать методы "select" и "group" для получения вашего результата.)

0 голосов
/ 21 февраля 2012

Получил работу со следующим кодом.

Invoice.find(:all, :select => 'invoices.*, SUM( time_entries.hours ) as time_spent_on_issues', :joins=>" JOIN time_entries ON time_entries.project_id = invoices.project_id", :conditions => ["invoices.project_id = ? AND time_entries.updated_on > invoices.created_at AND time_entries.updated_on < invoices.due_date", @project.id])

Кстати, "miked" код очень помог

...