2013-01-11 6 views
0

Je suis un peu confus au sujet d'une association HABTM avec rails 3.2.11.Peut implémenter une association has_and_belongs_to_many

J'ai un modèle d'image:

class Image < ActiveRecord::Base 
    attr_accessible :description, :name, :image, :article_ids 
    has_and_belongs_to_many :articles 
end 

Et un modèle de l'article:

class Article < ActiveRecord::Base 
    has_and_belongs_to_many :images 
    attr_accessible :content, :name, :image_ids 
end 

J'ai créé une migration:

class CreateImagesArticlesTable < ActiveRecord::Migration 
    def self.up 
    create_table :images_articles, :id => false do |t| 
     t.references :image 
     t.references :article 
    end 
    add_index :images_articles, [:image_id, :article_id] 
    add_index :images_articles, [:article_id, :image_id] 
    end 

    def self.down 
    drop_table :images_articles 
    end 
end 

Je ne rake db: migrate

Maintenant j'affiche chec kboxes de se connecter des articles et des images lorsque je mets à jour une image:

%div 
    - @articles.each do |article| 
    = check_box_tag "article_ids[]", article.id 
    = article.name 

Quand je vérifie la première case et mise à jour ne peut pas créer l'association, l'erreur est:

ActiveRecord :: StatementInvalid à ImagesController # mettre à jour

mysql2 :: erreur: table 'project_development.articles_images' does not exist. SELECT * FROM articlesarticles INNER JOIN articles_images SUR articles. id = articles_images. article_id O WH articles_images. image_id = 78

Params est:

{ "UTF8" => "✓", "_method" => "put", "authenticity_token" => "5qUu72d7asba09d7zbas7a9azsdas8a8dss", "image" => {"name" => "Test", "description" => "Description du test", "article_ids" => []}, "article_ids" => ["1"], "commit" => "Update image ", " id "=>" 78-test "}

Je vois la table dans MySQL Workbench, mais je ne peux pas regarder dedans car elle saisit:

Erreur: project_development. images_articles: données de table n'est pas modifiable car il n'y a pas de clé primaire pour la table

+0

witg Les rails HABTM ne créent pas de table supplémentaire. Utilisez 'has_many through' à la place – Eru

Répondre

0

En fin de compte j'ai changé à la migration de la table à articles_images et corrigé en vue de:

- @articles.each do |article| 
    = check_box_tag "image[article_ids][]", article.id, @image.articles.include?(article) 
    = article.name 

Cela fonctionne maintenant très bien avec HABTM.

1

La migration est erronée, le nom de la table se joindre au pluriel des deux noms de modèle, mais ils sont classés par ordre alphabétique, par exemple, il est articles_images pas images_articles.

De toute façon, il est préférable d'avoir un modèle de jointure, puis un has_many avec l'option :through.

+0

Merci, je vais essayer avec has_many et acceptera la réponse quand elle est réussie. – user929062

Questions connexes