我有:
class Service < ActiveRecord::Base
has_and_belongs_to_many :staffs
和
class Staff < ActiveRecord::Base
has_and_belongs_to_many :services
使用包含services_id和staffs_id
列的中间表services_staffs以下查询成功:
Staff.find( :all, :conditions => "service_id = #{service_id}" )
但走向另一个方向失败了:
Service.find( :all, :conditions => "staff_id = #{staff_id}" )
与
服务负载(0.3ms)SELECT“services”。*,t0.staff_id as the_parent_record_id FROM“services”INNER JOIN“services_staffs”t0 ON“services”.id = t0.service_id WHERE(t0.staff_id IN(12, 13,14))服务负载(0.0ms)SQLite3 :: SQLException:没有这样的列:staff_id:SELECT * FROM“services”WHERE(staff_id = 13)
ActiveRecord :: StatementInvalid(SQLite3 :: SQLException:没有这样的列:staff_id:SELECT * FROM“services”WHERE(staff_id = 13)):
知道为什么吗?
答案 0 :(得分:2)
我通常使用has_many然后通过,但概念是相同的。您需要在搜索中包含关联,以便
Service.find( :all, :include => :staffs, :conditions => "staffs.id = #{staff_id}" )
这将进行外部联接,因此将包括所有服务,并将急切加载人员数据。
Service.find( :all, :joins => :staffs, :conditions => "staffs.id = #{staff_id}" )
这将执行内部联接并且只有服务数据集(如果您调用service.staffs
,则必须转到数据库
对于未经请求的建议,我建议稍微修改您的查询。
Service.all(:include => :staffs, :conditions => ["staffs.id = ?", staff_id])
数组会转义staff_id
变量以帮助防止恶意代码攻击。