Rails 来自多个表的单个结果

Rails Single Results from Multiple Tables

使用Rails 4.2

我有两个模型,suppliersclients。两个模型都包含 name(字符串)和 email(字符串)。他们之间没有任何关系。

我想生成一份包含供应商和客户的所有姓名和电子邮件的列表。在此列表中,我还想知道合作伙伴是供应商还是客户。

控制器

@suppliers = Supplier.all
@clients = Client.all

@all_partners = (@suppliers + @clients).sort { |x, y| x.name <=> y.name }

查看

<% @all_partners.each do |partner| %>
  <%= partner.name %>, <%= partner.email %>, <%= partner.type %>
  <!-- I need some way to know if the partner type is a supplier or client -->
<% end %>

如何输入合作伙伴类型?有没有一种方法可以通过一次 AR 调用或查询来做到这一点?这基本上就是如何在 Rails.

中使用 SQL Union 语句

你可以得到 class 我认为对象的名称 <%= partner.class.model_name.human %>

ActiveRecord 中的联合只能在单个模型中使用。您可以使用原始 SQL 为两个不同的 table 联合使用,如下所示:

Supplier.connection.execute("(SELECT id, ..., 'suppliers' as table FROM suppliers WHERE...) UNION (SELECT id,... 'clients' as table FROM clientsWHERE...)")

但结果将是 PG::Result 类型。 不幸的是,最好的方法是使用两个 ActiveRecord 查询。 或者如果客户和供应商有相似的领域,你可以把它们放在一个 table

class Partner < ActiveRecord::Base
  default_scope where(is_supplier: true)
  scope :clients, -> { where(is_supplier: false) }
end

所以 Partner.all 将仅输出供应商,Partner.unscoped - 所有合作伙伴

感谢大家的帮助。

我最终使用了与问题中相同的控制器,并在视图中添加了一些附加信息。

查看

<% @all_partners.each do |partner| %>
  <%= partner.name %>, <%= partner.email %>, <%= partner.try(:client_type) %>, <%= partner.class.model_name.human  %>
<% end %>