Rails 来自多个表的单个结果
Rails Single Results from Multiple Tables
使用Rails 4.2
我有两个模型,suppliers
和 clients
。两个模型都包含 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 %>
使用Rails 4.2
我有两个模型,suppliers
和 clients
。两个模型都包含 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 %>