2014-06-23 21 views
0

我在PostgreSQL數據庫三個表:顯示在他們的順序加入數據記錄在PostgreSQL和Ruby on Rails創建

  1. 成員

    • ID
    • FIRST_NAME
    • 姓氏
    • created_at
  2. 付款(贊借記)

    • ID
    • member_id
    • created_at
    • 類型
  3. 費用(贊信用)

    • ID
    • member_id
    • created_at

我想向他們展示在一個視圖中說賬單: ,我用下面的查詢:

select * from members as t1 left join payments as t2 on (t1.id=t2.member_id) left join fees as t3 on (t1.id=t3.member_id) 

,它顯示了我下面的結果:

id | Amount | created_at | Type 
1 100  25-12-2013 Fee 
2 100  29-12-2013 Fee 
3 100  25-12-2013 Payment 
4 100  23-12-2013 Payment 

但問題是,它顯示了第一個收費記錄,然後付款,而我需要它應該是爲了通過created_at,它應該是象下面這樣:

id | Amount | created_at | Type 
1 100  23-12-2013 Payment 
2 100  25-12-2013 Fee 
3 100  25-12-2013 Payment 
4 100  29-12-2013 Fee 
車型

下面是詳細信息:

class Fee < ActiveRecord::Base 

    # Setup accessible (or protected) attributes for your model 
    attr_accessible :member_id,:fee_type,:amount,:reason,:details,:date 

    # Setup relations with relative models 
    belongs_to :member 

    # Validates rule here 
    validates_numericality_of :member_id,:fee_type,:amount 

    validates :reason, 
    :format => {:with => /^[-a-zA-Z0-9_ ]+$/ }, 
    :length => {:maximum => 255}, 
    :presence =>true 
    validates :details, 
    :format => {:with => /^[-a-zA-Z0-9_ ]+$/ }, 
    :length => {:maximum => 255}, 
    :allow_blank =>true 
    validates :amount, 
    :presence => true 
    validates :member_id, 
    :presence => true 
    validates :date, 
    :presence => true 

    # Search start here 
    self.per_page = 10 

end 

class Payment < ActiveRecord::Base 

    # Setup accessible (or protected) attributes for your model 
    attr_accessible :member_id,:payment_category_id,:payment_type_id,:payment_date,:amount,:notes,:is_send_email,:last_sent,:date_deposite 
    # Setup relations with relative models 
    belongs_to :payment_type 
    belongs_to :payment_category 
    belongs_to :member 

    # Validates rule here 
    validates_numericality_of :member_id,:payment_category_id,:payment_type_id,:amount 

    validates :notes, 
    :format => {:with => /^[-a-zA-Z0-9_ ]+$/ }, 
    :length => {:maximum => 255}, 
    :allow_blank =>true 
    validates :amount, 
    :presence => true, 
    :length => {:maximum => 15} 
    validates :member_id, 
    :presence => true 
    validates :payment_date, 
    :presence => true 

    # Pagiination start here 
    self.per_page = 10 

end 

class Member < ActiveRecord::Base 

    has_many :payment, dependent: :destroy, -> { order :created_at } 
    has_many :fee, dependent: :destroy, -> { order :created_at } 
    has_many :events, :through => :participants 

end 
+1

'ORDER BY created_at' does not work for you? –

+0

不,它不起作用 –

+0

你可以擴展它「它不工作」...例如給我們一個例子,當你使用訂單時它看起來像什麼...有時如果你解釋事情「不工作」他們可以幫助我們導致更好的解決方案,從而實現工作:) –

回答

1

根據您多少記錄拉出,你也可以做將數據從數據庫中拉出後進行排序,例如:

transactions = member.payments + member.fees 
transactions = transactions.flatten.sort_by(&:created_at) 
+0

它正在工作,而不是這個我創建了一個公用表事務和存儲兩個表中的記錄在同一個和使用rails範圍 –

2

如果我是你,我會用ActiveRecord Associations這樣的:

#app/models/member.rb 
Class Member < ActiveRecord::Base 
    has_many :payments, -> { order :created_at } 
    has_many :fees, -> { order :created_at } 
end 

#app/models/payment.rb 
Class Payment < ActiveRecord::Base 
    belongs_to :member 
end 

#app/models/fee.rb 
Class Fee < ActiveRecord::Base 
    belongs_to :member 
end 

應該給你拉你需要它有序的關聯數據,這樣的能力:

@member = Member.find 1 
@member.payments #-> should be ordered by created_at 
+0

它再次顯示付款先支付費用,但我需要按日期排序。示例費用記錄1和費用記錄2在2013年和2015年創建。支付記錄1和支付記錄2在2012年和2014年創建。然後,訂單必須類似於 - >支付記錄1>訂單記錄1>支付記錄2,然後費用記錄2 –

+0

嗯所以它不能正常工作?你能給我一些背景知道爲什麼你需要這種類型的設置嗎? –

+0

它更類似於銀行對賬單中的借項和貸項。費用可能像信用卡和付款一樣,如借記卡。現在我們必須打印一份像結構一樣的銀行結單。 –