Ruby on rails Rails从多个表生成单个结果

Ruby on rails Rails从多个表生成单个结果,ruby-on-rails,union,rails-activerecord,Ruby On Rails,Union,Rails Activerecord,使用Rails 4.2 我有两种型号,供应商和客户。两种型号都包含名称(字符串)和电子邮件(字符串)。他们之间没有任何关系 我想生成一个列表,列出所有供应商和客户的姓名和电子邮件。在此列表中,我还想知道合作伙伴是供应商还是客户 控制器 @suppliers = Supplier.all @clients = Client.all @all_partners = (@suppliers + @clients).sort { |x, y| x.name <=> y.name } @s

使用Rails 4.2

我有两种型号,
供应商
客户
。两种型号都包含
名称
(字符串)和
电子邮件
(字符串)。他们之间没有任何关系

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

控制器

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

@all_partners = (@suppliers + @clients).sort { |x, y| x.name <=> y.name }
@suppliers=Supplier.all
@clients=Client.all
@所有合作伙伴=(@suppliers+@clients)。排序{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 %>
<% @all_partners.each do |partner| %>
  <%= partner.name %>, <%= partner.email %>, <%= partner.try(:client_type) %>, <%= partner.class.model_name.human  %>
<% end %>

, 

我如何输入它是哪种类型的合作伙伴?有没有一种方法可以通过一个AR调用或查询来实现这一点?这基本上就是如何在Rails中使用SQL Union语句。

您可以获得我相信的对象的类名
您可以获得我相信的对象的类名
在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
类伙伴{where(is_supplier:false)}
终止

因此,
Partner.all
将只输出供应商,
Partner.unscoped
-ActiveRecord中的所有合作伙伴联合仅在单个模型中工作。可以使用原始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
类伙伴{where(is_supplier:false)}
终止

因此,
Partner.all
将只输出供应商,
Partner.unscoped
-所有合作伙伴

谢谢大家的帮助

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

查看

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

, , 

谢谢大家的帮助

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

查看

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

, , 

将它们放在一个表中可能是最好的解决方案。尽管由于应用程序在供应商方面做了大量工作,如果我继续需要忽略客户,那么剩下的代码会有点麻烦。你只需添加一个指示对象类型的字段,并创建一个默认范围来选择供应商,另一个范围来选择用户,因此,只需对codeadded示例进行微小的更改即可回答问题。将它们放在一个表中可能是最好的解决方案。尽管由于应用程序在供应商方面做了大量工作,如果我继续需要忽略客户,那么剩下的代码会有点麻烦。你只需添加一个指示对象类型的字段,并创建一个默认范围来选择供应商,另一个范围来选择用户,因此,只需对代码稍作修改即可添加示例以帮助回答问题。谢谢我在
clients
中也有一个字段,它在
suppliers
中不存在,我在视图中使用
try
输出该字段,虽然不更改表,但它不能减少查询数量。所以我想我只能回答部分问题。这确实有帮助。谢谢我在
clients
中也有一个字段,它在
suppliers
中不存在,我在视图中使用
try
输出该字段,虽然不更改表,但它不能减少查询数量。所以我想我只能回答部分问题。