我需要从控制器运行mysql查询,但我不知道如何连接到db。
这是我的方法:
def set_dcs
sql="select employees.nombre, employees.apellido_paterno, employees.apellido_materno from employees, activities, field_tests
where activities.field_test_id=field_tests.id and employees.id=activities.dcs_id and field_tests.id=id"
end
如何获得查询的结果?
我该如何进行相同的查询,但使用ActivereCord?
您可以通过ActiveRecord::Base.connection
执行RAW SQL,但我很少推荐它,而在这种情况下肯定不是,而是出于Edification的目的
def set_dcs
sql= <<SQL
select employees.nombre, employees.apellido_paterno, employees.apellido_materno
from employees, activities, field_tests
where activities.field_test_id=field_tests.id and employees.id=activities.dcs_id and field_tests.id=id
SQL
ActiveRecord::Base.connection.exec_query(sql)
end
我不确定尾随的id
是什么参考,由于含糊不清,它会引起SQL错误。我要假设这是一个参数,也是其余部分加入的主要搜索条件。
说,由于您使用的是轨道,这些可能是真正的关联,并加入会导致更可读的控制器代码,例如型号定义
class Employee < ActiveRecord::Base
has_many :activities, foreign_key: :dcs_id
has_many :field_tests, through: :activities
end
class FieldTest < ActiveRecord::Base
has_many :activities
end
class Activity < ActiveRecord::Base
belongs_to :employee, foreign_key: :dcs_id
belongs_to :field_test
end
然后,控制器简单
Employee.
select("employees.nombre, employees.apellido_paterno, employees.apellido_materno").
joins(:field_tests).where(field_tests: {id: SOME_ID})
生成的SQL将类似于
SELECT
employees.nombre,
employees.apellido_paterno,
employees.apellido_materno
FROM
employees
INNER JOIN activities ON employees.id = activities.dcs_id
INNER JOIN field_tests ON activities.field_test_id = field_tests.id
WHERE
field_tests.id = SOME_ID
这将返回Employee
对象的集合,而不是ActiveRecord::Result
(从ActiveRecord::Base.connection.exec_query
返回(,它比Array
更相似。