Rails多个表的单个结果

时间:2015-04-16 20:14:44

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

使用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语句。

3 个答案:

答案 0 :(得分:3)

您可以获取我认为<%= partner.class.model_name.human %>

的对象的类名

答案 1 :(得分:1)

感谢大家的帮助。

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

查看

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

答案 2 :(得分:0)

ActiveRecord中的Union仅在单个模型中起作用。您可以使用原始SQL为两个不同的表使用union,如下所示:

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

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

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

所以Partner.all只会输出供应商Partner.unscoped - 所有合作伙伴