现有协会
class Job < ActiveRecord::Base
belongs_to :client
belongs_to :contact
belongs_to :location
has_one :geofence, :through => :location
end
class Client < ActiveRecord::Base
has_many :contacts
has_many :locations
end
class Contact < ActiveRecord::Base
belongs_to :client
end
class Location < ActiveRecord::Base
belongs_to :client
belongs_to :geofence
end
class Geofence < ActiveRecord::Base
has_many :locations
end
在尝试寻找从各种表中搜索字段的工作时,我会做这样的事情
@jobs = Job.find(:all, :joins => [:client,:contact,:location,:geofence], :conditions => ['geofences.address like ?',"%#{params[:term]}%"])
产生以下错误
ActiveRecord::StatementInvalid (Mysql::Error: Unknown column 'geofences_jobs_join.location_id'
来自以下查询
SELECT `jobs`.* FROM `jobs` INNER JOIN `clients` ON `clients`.id = `jobs`.client_id INNER JOIN `contacts` ON `contacts`.id = `jobs`.contact_id INNER JOIN `locations` ON `locations`.id = `jobs`.location_id INNER JOIN `locations` geofences_jobs_join ON (`jobs`.`id` = `geofences_jobs_join`.`location_id`) INNER JOIN `geofences` ON (`geofences`.`id` = `geofences_jobs_join`.`geofence_id`) WHERE ...
有没有办法通过作业模型中的不同关联或查询的连接部分来解决此问题?
我可以使用find_by_sql获得我需要的东西,但如果可能的话我想避免这种情况。
答案 0 :(得分:1)
我认为,为了使用has_one :through
关联,您的Job
模型应该声明has_one :location
关联,而不是相反,请参阅this example。
也就是说,您可以尝试重新定义此关联并将location_id外键从jobs表移动到位置中的job_id,或者尝试此查询:
@jobs = Job.find(:all, :joins => [:client, :contact, { :location => :geofence }], :conditions => ['geofences.address like ?',"%#{params[:term]}%"])
在后一种情况下,您必须删除has_one :through
。