Как сделать SQL-запрос из многих таблиц на Rails? - PullRequest
0 голосов
/ 18 апреля 2011

Спасибо, что прочитали мой вопрос.

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

SELECT 
    ffca.name, 
    ffc.name, 
    ft.title, 
    concat(s.first_name, ' ', s.last_name), 
    pf.name, 
    ft.amount, 
    date_format(ft.created_at,'%d/%m/%y') 
FROM 
    finance_transactions ft 
    INNER JOIN students s                  ON ft.student_id = s.id 
    INNER JOIN payment_forms pf            ON ft.payment_form_id = pf.id 
    INNER JOIN finance_fees ff             ON ft.finance_fees_id = ff.id 
    INNER JOIN finance_fee_collections ffc ON ff.fee_collection_id = ffc.id 
    INNER JOIN finance_fee_categories ffca ON ffc.fee_category_id = ffca.id;

Если вам нужна дополнительная информация, пожалуйста, не стесняйтесь спрашивать меня.

Большое спасибо.

Ответы [ 2 ]

2 голосов
/ 18 апреля 2011

Например,

Ваша модель - finance_transactions

   finace_transaction = FinanceTransaction.find_by_sql(
    "SELECT 
        ffca.name as name, 
        ffc.name as name1, 
        ft.title as title, 
        concat(s.first_name, ' ', s.last_name) as full_name, 
        pf.name as pf_name, 
        ft.amount as count, 
        date_format(ft.created_at,'%d/%m/%y') as time
    FROM 
        finance_transactions ft 
        INNER JOIN students s                  ON ft.student_id = s.id 
        INNER JOIN payment_forms pf            ON ft.payment_form_id = pf.id 
        INNER JOIN finance_fees ff             ON ft.finance_fees_id = ff.id 
        INNER JOIN finance_fee_collections ffc ON ff.fee_collection_id = ffc.id 
        INNER JOIN finance_fee_categories ffca ON ffc.fee_category_id = ffca.id"
    )

Таблица таблицы finance_transactions должна иметь имя столбца, имя1, заголовок, полное_имя, имя_файла, число, время

итогда вы можете использовать:

finace_transaction.name1 gets ffc.name
1 голос
/ 18 апреля 2011

Возможно, вы захотите предоставить метод в своем классе модели в качестве оболочки

class FinanceTransaction < ActiveRecord::Base
[...]
  def self.find_fee_transactions
    self.find_by_sql(<<-SQL)
      SELECT 
        ffca.name as name, 
        ffc.name as name1, 
        ft.title as title, 
        concat(s.first_name, ' ', s.last_name) as full_name, 
        pf.name as pf_name, 
        ft.amount as count, 
        date_format(ft.created_at,'%d/%m/%y') as time
      FROM 
        finance_transactions ft 
        INNER JOIN students s                  ON ft.student_id = s.id 
        INNER JOIN payment_forms pf            ON ft.payment_form_id = pf.id 
        INNER JOIN finance_fees ff             ON ft.finance_fees_id = ff.id 
        INNER JOIN finance_fee_collections ffc ON ff.fee_collection_id = ffc.id 
        INNER JOIN finance_fee_categories ffca ON ffc.fee_category_id = ffca.id"
      )
    SQL
  end
end
...