如何为具有两个外键的模型创建范围?

支付宝

我有模特AccountTransaction

和模型中Account有两个外键Transaction

transaction.rb:

  belongs_to :credit_account, class_name: 'Account',
    foreign_key: 'credit_account_id', optional: true
  belongs_to :debit_account, class_name: 'Account',
    foreign_key: 'debit_account_id', optional: true

此外,交易记录中还有列debit_amountcredit_amount

account.rb:

  has_many :debit_account_transactions,
    class_name: 'Transaction',
    foreign_key: 'debit_account_id',
    dependent: :nullify
  has_many :credit_account_transactions,
    class_name: 'Transaction',
    foreign_key: 'credit_account_id',
    dependent: :nullify

我要确定范围,即按交易总和(借方金额+贷方金额)对帐户进行排序,使用范围我将为每个帐户输出total_amount。

现在,我有下一个范围:

joins(:credit_account_transactions, :debit_account_transactions)
      .where('transactions.created_at >= ?', 1.month.ago)
      .select(
        'accounts.*',
        'SUM(transactions.debit_amount_cents) AS total_debit_amount',
        'SUM(transactions.credit_amount_cents) AS total_credit_amount',
        'SUM(transactions.credit_amount_cents + transactions.debit_amount_cents) AS total_amount'
      )
      .order('total_amount DESC')
      .group('accounts.id')
  end

但是它不能正常工作。它不算在内debit_amount

Account.accounts_balance.first.total_credit_amount
=> 1500
Account.accounts_balance.first.total_debit_amount 
=> 0

但是,如果swap:credit_account_transactions:debit_account_transactionsinjoins(:credit_account_transactions, :debit_account_transactions)将计数total_debit_amount,则total_credit_amount-不会。

辛·利瑟(Siim Liiser)

您要两次加入同一张桌子。它们将有所不同,并且必须以不同的方式引用。Rails尝试变得聪明,并重命名第二个联接。

只运行Account.joins(:credit_account_transactions, :debit_account_transactions),看看它产生什么SQL。它可能类似于:

SELECT "accounts".* FROM "accounts"
INNER JOIN "transactions"
  ON "transactions"."credit_account_id" = "accounts"."id"
INNER JOIN "transactions" "credit_account_transactions_accounts"
  ON "credit_account_transactions_accounts"."debit_account_id" = "accounts"."id";

在这里,您可以看到credit_account_transactions_accounts在这种情况下,第二个联接已重命名为其他名称(),因此您必须这样引用它。

.select(
  'accounts.*',
  'SUM(transactions.debit_amount_cents) AS total_debit_amount',
  'SUM(credit_account_transactions_accounts.credit_amount_cents) AS total_credit_amount',

本文收集自互联网,转载请注明来源。

如有侵权,请联系 [email protected] 删除。

编辑于
0

我来说两句

0 条评论
登录 后参与评论

相关文章

如何为具有相同关系的两个外键的模型编写关联?

如何从Django中具有外键关系的两个模型中选择值

Diango 1.6如何为具有两个ForeignKey字段的模型创建对象?

如何通过UCanAccess创建具有两个对另一个表的外键引用的表?

用于同时编辑具有外键关系的两个Django模型的表单

具有两个外键的中间模型:文件结构?

Django-具有两个以上外键的模型

如何在Rails 3.2应用程序中从具有不同键的两个模型创建数组?

如何从两个单独的数组中创建具有两个键/值对的对象

当模型具有两个具有不同 on_delete 约束的外键时,预期行为是什么?

具有两个相同外键的Django Inlineformset

如何为具有两个范围条件的查询建立索引?

Django:两个模型的外键

如何为具有两个固定效应的混合效应模型编写lmer公式

将具有外键关系的两个模型数据传递给一个html模板

如何使用Android Room创建带有两个或更多外键的表?

如何创建桥表?是否创建两个主键和两个外键?

具有两个外键的两个表之间的Laravel关系

如何具有包含两个模型的视图模型

如何设置带有两个外键的实体?

如何使用Hibernate创建具有两个外键列的表的实体:未为实体指定标识符:

django模型外键访问两个模型的属性

如何创建具有2个外键的Friends对象?

带有两个外键字段指向同一个外模型的模型的 Django 聚合?

如何为 django 中具有索引功能的两个应用程序创建一个 url?

您可以在一个模型中创建引用同一模型的两个外键的实例吗?

如何在Django中创建对多个模型之一具有外键的模型?

如何在没有与外键和主键相同的字段的两个表之间创建关系

如何为一个类创建两个构造函数,两个构造函数都具有字符串,string,但它们的用途不同?