3 votes

has_one :through => :belongs_to produit une mauvaise requête

Associations existantes

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

En essayant de trouver des emplois en recherchant des champs dans différentes tables, je fais quelque chose comme ceci

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

ce qui produit l'erreur suivante

ActiveRecord::StatementInvalid (Mysql::Error: Unknown column 'geofences_jobs_join.location_id'

à partir de la requête suivante

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 ...

Y a-t-il un moyen de résoudre ce problème en utilisant une association différente dans le modèle des emplois ou dans la partie de ma requête concernant les jointures ?

Je pourrais obtenir ce dont j'ai besoin en utilisant find_by_sql mais j'aimerais éviter cela si possible.

1voto

HargrimmTheBleak Points 1345

Je pense qu'afin d'utiliser un has_one :through association, votre Job doit déclarer un modèle has_one :location association, et non l'inverse, voir cet exemple .

Cela dit, vous pouvez soit essayer de redéfinir cette association et déplacer la clé étrangère location_id de la table jobs vers job_id dans locations, soit essayer cette requête :

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

Dans ce dernier cas, vous devrez supprimer l'élément has_one :through .

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X