可以实现has_and_belongs_to_many关联

时间:2013-01-11 17:39:45

标签: mysql ruby-on-rails-3 has-and-belongs-to-many

我对使用rails 3.2.11的HABTM关联感到有点困惑。

我有一个Image模型:

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

一篇文章模型:

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

我创建了一个迁移:

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

然后我做了rake db:migrate

现在,当我更新图像时,我会显示连接文章和图像的复选框:

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

当我检查第一个复选框并更新它无法创建关联时,错误是:

ImageController#update中的ActiveRecord :: StatementInvalid

Mysql2 ::错误:表'project_development.articles_images'不存在:SELECT articles。* FROM articles INNER JOIN articles_images ON articles。{{1 }} = idarticles_images WHERE article_idarticles_images = 78

Params是:

{ “UTF8”=&gt; “中✓”,  “_method”=&gt; “中放”,  “authenticity_token”=&gt; “中5qUu72d7asba09d7zbas7a9azsdas8a8dss”,  “图像”=&GT; { “名称”=&gt; “中测试”,  “描述”=&gt; “中Testdescription”,  “的article_ids”=&GT; []},  “的article_ids”=&GT; [ “1”],  “commit”=&gt;“更新图片”,  “ID”=&gt; “中78测试”}

我在MySQL Workbench中看到了这个表,但我不能调查它,因为它是sais:

错误:image_idproject_development:表数据不可编辑,因为没有为表定义主键

2 个答案:

答案 0 :(得分:1)

迁移错误,表名加入两个模型名称的复数,但它们按字母顺序排序,即articles_images而不是images_articles

无论哪种方式,最好使用加入模型,然后使用has_many选项:through

答案 1 :(得分:0)

最后我改为将表迁移到articles_images并将视图更正为:

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

现在可以正常使用HABTM。