1

这是我正在尝试做的事情:

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

whereAccount::cashflows显然是所有cashflows存储account_idinfrom_account或 in的列表to_account

我很困惑。处理这种情况的正确方法是什么?这是多么糟糕的设计?设计这种关系的正确方法是什么?

4

3 回答 3

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

这些应该是很好的起点。他们不符合你的要求吗?

于 2013-02-22T11:13:55.963 回答
2

我认为您的结构正确,因为特定交易/现金流只能涉及两个账户。如果您使用多对多关联,则需要处理不涉及多于或少于 2 个帐户的验证。对于您当前的结构,您可以将您的模型关联更改为:

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

通过这种方式,您可以跟踪特定账户中借记/贷记的金额,并获取参与特定交易/现金流的账户。

于 2013-02-22T11:36:15.037 回答
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。

于 2013-02-22T11:13:44.600 回答