multiple belongs_to relationships between two classes in Rails
Asked Answered
S

1

7

I have a Transaction class. Each object of this class includes one issuing account, one sending account and one receiving account. Each of these is an instance of Account class. In my Transaction table, I have issuer_id, sender_id and receiver_id.

How should I specify relationship between Transaction and Account so that I can call

transaction.issuer
transaction.sender
transaction.receiver

Thank you.

Sibley answered 14/9, 2011 at 2:29 Comment(0)
H
16

Use :class_name to specify the class name, when it can't be guessed from the association name:

class Transaction
  belongs_to :issuer,   :class_name => 'Account'
  belongs_to :sender,   :class_name => 'Account'
  belongs_to :receiver, :class_name => 'Account'
end

class Account
  has_many :issued_transactions,   :foreign_key => :issuer,   :class_name => 'Transaction'
  has_many :sent_transactions,     :foreign_key => :sender,   :class_name => 'Transaction'
  has_many :received_transactions, :foreign_key => :receiver, :class_name => 'Transaction'
end

You can read more in the documentation.

Hardboard answered 14/9, 2011 at 2:32 Comment(8)
Thanks a lot meagar. I was puzzled by how I could specify the has_many/has_one in Account class vis-a-vis Transaction class. It turns out that I don't need to.Sibley
Not unless you intend to reference an account's transactions.Hardboard
I was about to add that question. How should I call something like: acccount_one.transactions_as_issuer?Sibley
See the updated :foreign_key stuff; I wasn't thinking when I said use :inverse_of.Hardboard
huhm, the has_many :foreign_key :classname specification doesn't seem to work for me. (I changed foreign_keys to :issuer_id etc. but it doesn't work either)Sibley
It is :class_name, not :classnameHardboard
Thanks a bunch. In terms of user experience, SO can't be better than this :) What I learn from this is that belongs_to and has_one/many can be defined independently. Foreign keys must be stated explicitly when having multiple "roles".Sibley
Is this possible to do has_many :transactions and print out an aggregated list?Staff

© 2022 - 2024 — McMap. All rights reserved.