3

既存の協会

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を使用して必要なものを取得できましたが、可能であればそれを避けたいと思います。

4

1 に答える 1

1

has_one :throughアソシエーションを使用するには、Jobモデルでアソシエーションを宣言する必要があると思います。その逆ではありません。この例has_one :locationを参照してください。

そうは言っても、この関連付けを再定義してlocation_id外部キーをjobsテーブルからlocationsのjob_idに移動するか、次のクエリを試すことができます。

@jobs = Job.find(:all, :joins => [:client, :contact, { :location => :geofence }], :conditions => ['geofences.address like ?',"%#{params[:term]}%"])

後者の場合、を削除する必要がありますhas_one :through

于 2012-08-27T15:41:43.337 に答える