【问题标题】:How to access other columns of has_many through table如何通过table访问has_many的其他列
【发布时间】:2022-08-19 00:45:40
【问题描述】:

我正在使用 2 个模型(PartnerPackage)在 rails 7 上工作,我想将包裹分配给合作伙伴,但它们需要与订单一起分配。

例如,如果我将 package#A 和 package#B 分别分配给第 1 和第 2 订单的合作伙伴,则 package#A 将被视为小包,而 package#B 将被视为中包。

所以,我创建了PartnerPackage 将它们链接在一起(与has_many through:),还添加了package_order 列来包含包裹的订单。

问题

检索属于特定合作伙伴以及package_order 的所有包的最佳方法是什么?非常感谢您的回答!

合作伙伴.rb

class Partner < ApplicationRecord
  has_many :partner_packages, dependent: :destroy
  has_many :packages, through: :partner_packages
end

包.rb

class Package < ApplicationRecord
  has_many :partner_packages, dependent: :destroy
  has_many :packages, through: :partner_packages
end

合作伙伴包.rb

class PartnerPackage < ApplicationRecord
  belongs_to :partner
  belongs_to :package

  validates :package_order, presence: true
end
  • Partner.find(1).join(:packages) 应该给你一些可以使用的东西。

标签: ruby-on-rails


【解决方案1】:

Rails 有一个几乎隐藏的特性,它允许您将任何其他列添加到 SQL 选择中,并且 Rails 使它们在结果对象中作为只读属性可用,例如:

[24] pry(main)> ff = Foo.select("*, current_timestamp as now").first
  Foo Load (0.3ms)  SELECT *, current_timestamp as now FROM "foos" ORDER BY "foos"."id" ASC LIMIT ?  [["LIMIT", 1]]
=> #<Foo:0x0000000106442580 id: 1, name: "First Foo", age: 1, created_at: Thu, 21 Jul 2022 00:13:26.758228000 UTC +00:00, updated_at: Thu, 11 Aug 2022 15:23:14.015000000 UTC +00:00>
[25] pry(main)> ff.now
=> "2022-08-18 16:40:25"

因此,您可以使用它来提取 hmt 表中的字段,因为您知道 SQL 将在该表上包含一个联接:

partner.packages.select("partners.*, partner_packages.package_order")

现在,如果您想变得花哨,可以使用Arel 来避免字符串表名,但这是基本思想。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2014-03-10
    • 1970-01-01
    • 2015-03-21
    • 2020-11-29
    • 1970-01-01
    • 2017-11-24
    • 2013-04-22
    • 1970-01-01
    相关资源
    最近更新 更多