【问题标题】:Properly joining tables in Rails using ActiveRecord使用 ActiveRecord 在 Rails 中正确连接表
【发布时间】:2014-07-28 11:42:47
【问题描述】:

我的模型: 模型/组织.rb

class Organization < ActiveRecord::Base
  has_many :organization_payments
end

models/organization_payment.rb

class OrganizationPayment < ActiveRecord::Base
  belongs_to :organization
end

组织表中包含以下列:

id
org_name

organization_payments 包含以下列:

organization_id
amount

当我这样做时:

@organization_payments = OrganizationPayment.joins(:organization)
.where("organization_payments.organization_id = organizations.id")

我只从 organization_payments 表中获取列,而不是从 organizations 表中获取 org_name 列。 joins 语句的正确语法是什么?

警告:

请注意,如果两个表都有一个 id 列(它们应该),您需要具体说明包含哪一个,否则您最终会在索引视图中得到不正确的链接。

【问题讨论】:

    标签: ruby-on-rails rails-activerecord ruby-on-rails-4.1


    【解决方案1】:

    Marek Lipka 的回答很好,但我也建议您看看代表。如果您将 OrganizationPayment 修改为:

    class OrganizationPayment < ActiveRecord::Base
      belongs_to :organization
      delegate :org_name to: :organization
    end
    

    然后您就可以调用 organization_payment.org_name 来检索组织名称。如果您想遍历许多 OrganizationPayment 对象,请使用 includes 确保委托不会为每次查找生成新的 SQL 调用。所以:

    OrganizationPayment.includes(:organization).each{|payment| puts payment.org_name}
    

    【讨论】:

      【解决方案2】:

      在这种情况下,您应该使用select,如下所示:

      @organization_payments = OrganizationPaiment.select('*, organizations.org_name as organization_name').joins(:organization)
      

      这样,org_name 的值可以像这样访问:

      organization_payment.organization_name
      

      实现相同目标的更多“Rails”方法是使用includes 预加载关联组织:

      @organization_payments = OrganizationPayment.includes(:organization)
      

      只需使用ActiveRecord 关联,如下所示:

      organization_payment.organization.org_name
      

      【讨论】:

      • 第一个(非 Rails 方式)有效,但 rails 方式无效。
      • Marek Lipka:没有错误,但 org_name 不存在,只有 organization_payments 表中的信息
      • 这是我遇到的一些小问题:stackoverflow.com/questions/25001027/…
      猜你喜欢
      • 2020-03-22
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2013-08-14
      • 2012-05-10
      相关资源
      最近更新 更多