Ruby on rails 多个查询在一个方向上工作,在另一个方向上失败

Ruby on rails 多个查询在一个方向上工作,在另一个方向上失败,ruby-on-rails,has-and-belongs-to-many,Ruby On Rails,Has And Belongs To Many,我有: 但朝另一个方向走是失败的: Staff.find( :all, :conditions => "service_id = #{service_id}" ) 与 服务负载(0.3ms)选择“服务”。*,t0.staff\u id作为“服务”上的“服务”内部连接“服务\u staff”t0的“父记录\u id”。id=t0.Service\u id其中(t0.staff\u id IN(12,13,14))服务负载(0.0ms)SQLite3::SQLException:无此类列:员

我有:

但朝另一个方向走是失败的:

Staff.find( :all, :conditions => "service_id = #{service_id}" )

服务负载(0.3ms)选择“服务”。*,t0.staff\u id作为“服务”上的“服务”内部连接“服务\u staff”t0的“父记录\u id”。id=t0.Service\u id其中(t0.staff\u id IN(12,13,14))服务负载(0.0ms)SQLite3::SQLException:无此类列:员工id:从“服务”中选择*,其中(staff\u id=13)

ActiveRecord::StatementInvalid(SQLite3::SQLException:没有这样的列:员工id:从“服务”中选择*,其中(员工id=13)):


你知道为什么吗?

我通常使用的方法很多,但概念是一样的。您需要在搜索中包含关联,以便

Service.find( :all, :conditions => "staff_id = #{staff_id}" )
这将进行外部联接,因此将包括所有服务,并将加载员工数据

Service.find( :all, :include => :staffs, :conditions => "staffs.id = #{staff_id}" )
这将进行内部连接,并且只包含服务数据集(如果您调用
service.staff,它将必须转到数据库

对于未经请求的建议,我建议稍微修改一下您的查询

Service.find( :all, :joins => :staffs, :conditions => "staffs.id = #{staff_id}" )

数组将逃避您的
staff\u id
变量,以帮助防止恶意代码攻击。

arg,我的错…它应该是
staff.staff\u id
而不是
服务。staff\u id
太棒了,明白了!再次感谢。在我的例子中,它实际上是“staff.id=?”。
Service.find( :all, :include => :staffs, :conditions => "staffs.id = #{staff_id}" )
Service.find( :all, :joins => :staffs, :conditions => "staffs.id = #{staff_id}" )
Service.all(:include => :staffs, :conditions => ["staffs.id = ?", staff_id])