Sql Rails 3.2 ActiveRecord从两个类似的表中选择结果
这感觉像是一些应该已经得到回答的问题,但我的search foo让我失望了 在Rails 3.2中,假设我们有两个DB表,它们的列与我们在本选择中关心的列完全相同,如下所示:Sql Rails 3.2 ActiveRecord从两个类似的表中选择结果,sql,ruby-on-rails,ruby,activerecord,rails-postgresql,Sql,Ruby On Rails,Ruby,Activerecord,Rails Postgresql,这感觉像是一些应该已经得到回答的问题,但我的search foo让我失望了 在Rails 3.2中,假设我们有两个DB表,它们的列与我们在本选择中关心的列完全相同,如下所示: create_table "current_employees" do |t| t.string "first_name" t.string "middle_name" t.string "last_name" . . . more columns end create_table "e
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
是的,虚构的例子:现在就去做吧
当人力资源部想要查找一名现任或前任员工时,他们不想区分这两个表:他们需要的结果可能在任何一个表中
如何设置模型、控制器等以从任一表中获取结果
例如,Jack Jackson在current_employees
表中,Jack O'Lantern在ex_employees
表中。搜索“Jack”时,结果表应该有两行,一行是Jack Jackson,另一行是Jack O'Lantern
更新为指定Rails 3.2。您必须执行两个不同的查询,并在单个数组中获得所有结果
search_results = []
search_results += CurrentEmployee.where("name like '%Jack%'").all
search_results += ExEmployee.where("name like '%Jack%'").all
现在在视图中显示数组中的所有记录如果不需要对数据库进行更改,可以使用一个合并两个表的视图,并从该视图进行建模
class Employee < ActiveRecord::Base
self.table_name = 'Employeeview'
self.primary_key = 'employee_id'
protected
def readonly?
true
end
end
class Employee
在不知道正在使用哪个版本的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\""
说得好。更新问题以指定我在Rails 3.19上。此:
CurrentEmployees.joins(“完全外部连接ex_employees”)。我认为(“名字像“?%”,“Jack”)
应该在哪里工作