我对HABTM与轨道3.2.11的关联有点困惑。
我有一个图像模型:
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:迁移
现在,当我更新图像时,我会显示复选框来连接文章和图像:
%div
- @articles.each do |article|
= check_box_tag "article_ids[]", article.id
= article.name
当我选中第一个复选框并更新它时,它无法创建关联,错误是:
ActiveRecord::StatementImagesController#更新中无效
Mysql2::错误:表"project_development.articles_images"不存在:SELECT articles
.*FROM articles
INNER JOIN articles_images
ON articles
。id
=articles_images
。article_id
,其中articles_images
。image_id
=78
参数为:
{"utf8"=>"✓","_method"=>"put","authenticity_token"=>"5qUu72d7asba09d7zbas7a9azdas8a8dss","image"=>{"name"=>"测试","description"=>"测试描述","article_ids"=>[]},"article_ids"=>["1"],"commit"=>"更新图像","id"=>"78 test"}
我在MySQL Workbench中看到了这个表,但我无法查看它,因为它显示:
错误:project_development
。images_articles
:表数据不可编辑,因为没有为表定义主键
迁移是错误的,表名连接了两个模型名称的复数,但它们是按字母顺序排列的,即是articles_images
而不是images_articles
。
无论哪种方式,最好先有一个联接模型,然后有一个带有:through
选项的has_many
。
最后,我改为将表迁移到articles_images,并将视图更正为:
- @articles.each do |article|
= check_box_tag "image[article_ids][]", article.id, @image.articles.include?(article)
= article.name
这现在适用于HABTM。