使用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语句。
答案 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
- 所有合作伙伴