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

whereは明らかに inまたは inに保存されているAccount::cashflowsすべてのリストです。cashflowsaccount_idfrom_accountto_account

よくわかりません。このような場合の適切な処理方法は何ですか? これはどのように悪いデザインですか?そのような関係を設計する適切な方法は何でしょうか?

4

3 に答える 3

2

特定のトランザクション/キャッシュフローに関与できるアカウントは 2 つだけであるため、適切な構造を持っていると思います。多対多の関連付けを使用する場合は、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 に答える
2

頭に浮かんだ提案

1) クラス (テーブル)cashflowsには、from_account と to_account の 2 つの列が必要です。

2)関係するアカウントのIDが必要from_accountですto_account

3)cashflowsすべきbelongs_to :account

4)accountする必要がありhas_many :cashflowsます。理想的にはそうあるべきですcash_flows

これらは良い出発点になるはずです。彼らはあなたの要件を満たしていませんか?

于 2013-02-22T11:13:55.963 に答える
1

ここでは、has と belongs to many 関連付けを使用する必要があると思います。

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 にアカウントを 1 つだけ追加できる検証コードが必要になります。

于 2013-02-22T11:13:44.600 に答える