2016-04-07 3 views
2

меня Оплата, счета-фактуры и настройки модели транзакций, как это:Rails сортировать запрос по дате

# transaction.rb 
class Transaction < ActiveRecord::Base 
    belongs_to :customer 
    belongs_to :transactionable, polymorphic: true 
end 

# payment.rb 
class Payment < ActiveRecord::Base 
    belongs_to :customer 
    has_many :transactions, as: :transactionable 
end 

# invoice.rb 
class Invoice < ActiveRecord::Base 
    belongs_to :customer 
    has_many :transactions, as: :transactionable 
end 

В моих клиентов показать шаблон, я нахожу, что все операции, которые принадлежат к запрашиваемому клиенту. Я хочу сортировать транзакции по дате счета-фактуры или платежа, к которому они принадлежат. Каков наилучший способ сделать это?

class CustomersController < ApplicationController 
    def show 
    @customer = Customer.find(params[:id]) 

    # I want the transactions sorted by the date of the Invoice or Payment they belong to 
    @transactions = Transaction.where(customer: @customer) 
    end 
end 

ответ

1

Если транзакция всегда создается вместе с оплатой или счета, вы можете использовать created_at метку времени на таблице транзакций. Однако, если это не так, чтобы удержать модель транзакции от конкретного понимания того, к каким моделям она может принадлежать, хорошим вариантом было бы создать другой столбец datetime в таблице транзакций и обновить ее с помощью любого времени и времени, наиболее актуального в связанный объект.

+0

Я согласен с этим решением, соответствующая 'сделка time' должны быть записаны на «Транзакция» отделена от любого времени «Счета» или «Оплата». – br3nt

+0

Это сработает, но если бы я хотел сортировать транзакции по другим значениям, таким как сумма платежа или счет-фактура, мне придется добавить эти столбцы в таблицу транзакций. Это кажется излишним. – James

2

Это возможно с областями.

Вы должны быть в состоянии сделать что-то вроде следующего:

transactions = Transaction.all 
transactions = transactions.order_by_payment_date 
transactions = transactions.order_by_invoice_date 
transactions = transactions.includes_transactionable 

transactions.each do |transaction| 
    # do what you want with the transaction and transactable 
end 

Надеюсь, этот код просто работает:

class Transaction < ActiveRecord::Base 
    belongs_to :customer 
    belongs_to :transactionable, polymorphic: true 

    scope :includes_transactionable, -> { includes(:transactionable) } 

    scope :order_by_payment_date, -> { 
    # This may or may not work, you may need to specify a has_many 
    # relationship to Payment, or do more to get the join to work 
    joins(Payment.arel_table).merge(Payment.descending) 
    } 

    scope :order_by_invoice_date, -> { 
    # This may or may not work, you may need to specify a has_many 
    # relationship to Invoice, or do more to get the join to work 
    joins(Invoice.arel_table).merge(Invoice.descending) 
    } 
end 

class Payment < ActiveRecord::Base 
    belongs_to :customer 
    has_many :transactions, as: :transactionable 

    scope :descending, -> { order(arel_table[:payment_date].desc) } 
end 

class Invoice < ActiveRecord::Base 
    belongs_to :customer 
    has_many :transactions, as: :transactionable 

    scope :descending, -> { order(arel_table[:invoice_date].desc) } 
end 
Смежные вопросы