Rails 3.2 ActiveRecord从两个相似的表中选择结果

时间:2014-07-03 13:37:55

标签: sql ruby-on-rails ruby activerecord rails-postgresql

这感觉就像应该已经回答的那样,但我的搜索foo让我失望。

在Rails 3.2中工作,假设我们有两个DB表,这些列对于我们在此select中关注的列具有足够相同的列,如下所示:

create_table "current_employees" do |t|
  t.string    "first_name"
  t.string    "middle_name"
  t.string    "last_name"
  . . . more columns
end

create_table "ex_employees" do |t|
  t.string    "first_name"
  t.string    "middle_name"
  t.string    "last_name"
  . . . more columns
end

是的,化妆的例子:现在就去吧。

当HR想要查找当前或以前的员工时,他们不想区分这两个表:他们需要的结果可以在任何一个表中。

如何设置模型,控制器,以从任一表中获取结果?

例如,Jack Jackson在current_employees表中,Jack O'Lantern在ex_employees表中。当搜索“Jack”时,结果表应该有两行,一行用于Jack Jackson,另一行用于Jack O'Lantern。

更新了以指定Rails 3.2。

3 个答案:

答案 0 :(得分:2)

如果您不需要对数据库进行更改,则可以使用一个视图来执行两个表的并集,并使您从此视图进行建模

class Employee < ActiveRecord::Base
  self.table_name = 'Employeeview'
  self.primary_key = 'employee_id'

  protected

  def readonly?
    true
  end
end

答案 1 :(得分:0)

您必须执行两个不同的查询并以单个数组

获取所有结果
search_results = []
search_results += CurrentEmployee.where("name like '%Jack%'").all
search_results += ExEmployee.where("name like '%Jack%'").all

现在显示视图中数组的所有记录

答案 2 :(得分:0)

在不知道您正在使用哪个版本的Rails的情况下,您可以使用Arel为外部联接生成SQL查询,例如:

Arel::Table.new(:current_employees).join(Arel::Table.new(:ex_employees), Arel::Nodes::OuterJoin).on(Arel::Table.new(:current_employees)[:first_name].eq(Arel::Table.new(:ex_employees)[:first_name]))

生成以下SQL查询:

irb(main):001:0> Arel::Table.new(:current_employees).join(Arel::Table.new(:ex_employees), Arel::Nodes::OuterJoin).on(Arel::Table.new(:current_employees)[:first_name].eq(Arel::Table.new(:ex_employees)[:first_name])).to_sql
=> "SELECT FROM \"current_employees\" LEFT OUTER JOIN \"ex_employees\" ON \"current_employees\".\"first_name\" = \"ex_employees\".\"first_name\""