has_and_belongs_to_many查询在一个方向上工作,在另一个方向上失败

时间:2010-07-02 18:16:05

标签: ruby-on-rails has-and-belongs-to-many

我有:

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)):

知道为什么吗?

1 个答案:

答案 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变量以帮助防止恶意代码攻击。