2009-05-07 6 views
2

Je construis un site de rails et j'ai des problèmes avec les associations. Au fond, je donne les résultats suivants:has_one on a list_to dans Rails?

class Publication < ActiveRecord::Base 
    belongs_to :category 
    has_one :site, :through => :category 
    named_scope :on_site,  lambda {|s| {:include => [:site], :conditions => ['sites.slug != ?', 's']}} 
end 
class Category 
    belongs_to :site 
    has_many :publications 
end 
class Site 
    has_many :categories 
    has_many :publications, :through => :categories, :foreign_key => 'category_id' 
end 

Publication.first.site produit le site de la première publication, site.first.publications fait aussi bien.

Le problème est à la portée du nom on_site, qui produit l'erreur suivante avec quelque chose comme Publication.on_site('s')

Mysql::Error: Unknown column 'categories.category_id' in 'on clause': SELECT 
`publications`.`id` AS t0_r0, `publications`.`shoot_id` AS t0_r1, 
`publications`.`category_id` AS t0_r2, `publications`.`title` AS t0_r3, 
`publications`.`slug` AS t0_r4, `publications`.`publish_on` AS t0_r5, 
`publications`.`created_at` AS t0_r6, `publications`.`updated_at` AS t0_r7, 
`publications`.`description` AS t0_r8, `publications`.`media_base_path` AS t0_r9, 
`sites`.`id` AS t1_r0, `sites`.`name` AS t1_r1, `sites`.`created_at` AS t1_r2, 
`sites`.`updated_at` AS t1_r3, `sites`.`slug` AS t1_r4, `sites`.`description` AS t1_r5, 
`sites`.`dhd_merch_id` AS t1_r6, `sites`.`members_area_url` AS t1_r7 FROM `publications` 
LEFT OUTER JOIN `categories` ON (`publications`.`id` = `categories`.`category_id`) 
LEFT OUTER JOIN `sites` ON (`sites`.`id` = `categories`.`site_id`) WHERE (sites.slug != 's') 

J'ai besoin que join soit publications.category_id = categories.id, une idée sur ce que j'ai eu tort?

Répondre

1

Eh bien, j'ai trouvé une solution en utilisant l'option :joins pour la portée, si quelqu'un est intéressé. J'aimerais quand même savoir si c'est possible sans utiliser :joins cependant.

named_scope :on_site,  lambda {|s| {:joins => 
    ['LEFT OUTER JOIN `categories` ON (`publications`.`category_id` = `categories`.`id`) ', 
    'LEFT OUTER JOIN `sites`  ON (`sites`.`id` = `categories`.`site_id`)'], 
    :conditions => ['sites.slug = ?', s]}} 
+0

J'espère que vous pouvez commenter la réponse de Jesse, parce qu'elle semble valide. –

2

Eh bien, voici un problème avec votre implémentation actuelle:

LEFT OUTER JOIN `categories` ON (`publications`.`id` = `categories`.`category_id`) 

Cet extrait de code SQL est créé par cette définition d'association dans Site:

has_many :publications, :through => :categories, :foreign_key => 'category_id' 

Le foreign_key il n'y a pas correct . Rails recherche une colonne au categories appelée category_id et s'attend à ce que la valeur de cette colonne corresponde à un identifiant de publication. Mais il n'y a pas d'option correcte foreign_key que vous pouvez définir, car la table categories ne ressemble pas à la table publications - c'est l'inverse.

Je ne suis pas sûr qu'il soit possible de faire fonctionner l'association has_many :through d'ActiveRecord via une association intermédiaire has_many. Mais je pense que vous pouvez utiliser la fonction d'association imbriquée pour faire ce travail:

class Publication < ActiveRecord::Base 
    belongs_to :category 
    #has_one :site, :through => :category 
    named_scope :on_site,  lambda {|s| {:include => { :category => :site }, :conditions => ['sites.slug != ?', s]}} 
end 

Une autre question est que vous mettez s entre guillemets dans le tableau des conditions. Cela ne devrait pas être entre guillemets.

+0

Jesse, je vais essayer lundi, je suis sûr que j'ai essayé tout ça avant de faire une jointure et ça n'a pas fonctionné (je suis sûr que ce que vous avez posté était ma première implémentation , avant que je commence juste à faire toutes sortes d'autres choses). En ce qui concerne les s entre guillemets, je ne pense pas que c'était vraiment le noeud de celui-ci. Si vous regardez le SQL généré que j'ai collé, la jointure essaie de faire correspondre publication.id avec category.category_id. En fait, il doit être "publication.category_id" avec category.id. –

+0

Oh oui, le 's' cité est un problème complètement séparé. Je voulais juste le signaler. –

+0

Eh bien, il semble que le code que vous avez posté ne le répare pas, j'ai encore besoin de faire les jointures manuellement. Votre named_scope produit la même erreur, il essaie de chercher une colonne 'sites_publications_join.category_id' qui n'existe pas –