Rails模型加入了has_many

时间:2013-02-22 10:59:29

标签: ruby-on-rails model model-associations

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

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_idfrom_account中的所有to_account的列表。

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

3 个答案:

答案 0 :(得分:2)

我最重要的建议

1)你的班级(表格)cashflows应该有两列from_account和to_account。

2)from_accountto_account应该拥有相关帐户的ID

3)cashflowsbelongs_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添加一个帐户。