这是我正在尝试做的事情:
class Cashflow < ActiveRecord::Base
belongs_to from_account, :class_name => 'Account'
belongs_to to_account, :class_name => 'Account'
end
class Account < ActiveRecord::Base
has_many :cashflows
end
其中Account::cashflows
显然是cashflows
存储在account_id
或from_account
中的所有to_account
的列表。
我很困惑。处理这种情况的正确方法是什么?这有多糟糕的设计?设计这种关系的正确方法是什么?
答案 0 :(得分:2)
我最重要的建议
1)你的班级(表格)cashflows
应该有两列from_account和to_account。
2)from_account
和to_account
应该拥有相关帐户的ID
3)cashflows
应belongs_to :account
4)account
应该has_many :cashflows
。理想情况下应该是cash_flows
这些应该是很好的起点。他们不符合你的要求吗?
答案 1 :(得分:2)
我认为您拥有正确的结构,因为特定交易/现金流中只能涉及两个账户。如果您使用多对多关联,则需要处理不涉及多于或少于2个帐户的验证。对于您当前的结构,您可以将moidel关联更改为:
class Cashflow < ActiveRecord::Base
belongs_to from_account, :class_name => 'Account', :foreign_key => :from_account
belongs_to to_account, :class_name => 'Account', :foreign_key => :to_account
end
class Account < ActiveRecord::Base
has_many :debits, :class_name => 'Cashflow', :foreign_key => :from_account
has_many :credits, :class_name => 'Cashflow', :foreign_key => :to_account
def cashflows
transactions = []
transactions << self.debits
transactions << self.credits
transactions.flatten!
## or may be the following commented way
# Cashflow.where('from_account = ? OR to_account = ?', self.id, self.id)
end
end
通过这种方式,您可以跟踪特定帐户中扣除/贷记的金额,还可以获取特定交易/现金流中涉及的帐户。
答案 2 :(得分:1)
我认为你应该使用has并且属于许多协会:
class Account < ActiveRecord::Base
has_and_belongs_to_many :incoming_cashflows, :class_name => 'Cashflow', :join_table => :incoming_cashflows_accounts
has_and_belongs_to_many :outcoming_cashflows, :class_name => 'Cashflow', :join_table => :outcoming_cashflows_accounts
end
class Cashflow < ActiveRecord::Base
has_and_belongs_to_many :from_accounts, :class_name => 'Account', :join_table => :incoming_cashflows_accounts
has_and_belongs_to_many :to_accounts, :class_name => 'Account', :join_table => :outcoming_cashflows_accounts
end
此外,您还需要一些验证码,只允许向Cashflow添加一个帐户。