2016-11-29 19 views
1

我有一个问题,我想创建一个主题标签系统,但是当我运行我的代码,当我想创建包含主题标签旅行我有这样的错误:找不到表“tags_travels”轨

ActiveRecord::StatementInvalid in TravelsController#create 
Could not find table 'tags_travels' 

这里是我的travel.rb

class Travel < ApplicationRecord 
    has_many :posts 
    belongs_to :user 
    has_and_belongs_to_many :tags 

    #after/before create 
    after_create do 
    travel = Travel.find_by(id: self.id) 
    sh = self.hashtags.scan(/#\w+/) 
    sh.uniq.map do |s| 
     tag = Tag.find_or_create_by(name: s.downcase.delete('#')) 
     travel.tags << tag 
    end 
    end 

    before_update do 
    travel = Travel.find_by(id: self.id) 
    travel.tags.clear 
    sh = self.hashtags.scan(/#\w+/) 
    sh.uniq.map do |s| 
     tag = Tag.find_or_create_by(name: s.downcase.delete('#')) 
     travel.tags << tag 
    end 
    end 
end 

我tag.rb

class Tag < ApplicationRecord 
    has_and_belongs_to_many :travels 
end 

的schema.rb文件(只是表conce )

create_table "tags", force: :cascade do |t| 
    t.string "name" 
    t.datetime "created_at", null: false 
    t.datetime "updated_at", null: false 
    end 

    create_table "topics", force: :cascade do |t| 
    t.string "title" 
    t.string "text" 
    t.string "end_date" 
    t.datetime "created_at", null: false 
    t.datetime "updated_at", null: false 
    t.integer "post_id" 
    end 

    create_table "travels", force: :cascade do |t| 
    t.string "name" 
    t.string "trip_type" 
    t.string "description" 
    t.datetime "created_at", null: false 
    t.datetime "updated_at", null: false 
    t.integer "user_id" 
    t.string "hashtags" 
    end 

    create_table "travels_tags", id: false, force: :cascade do |t| 
    t.integer "travel_id" 
    t.integer "tag_id" 
    t.index ["tag_id"], name: "index_travels_tags_on_tag_id" 
    t.index 

["travel_id"], name: "index_travels_tags_on_travel_id" 
    end 

有人有解决方案吗?谢谢 !

回答

1

Rails以特定语法查找连接表。它试图找到tags_travles,但你用travels_tags创建它。

更改您的模型关联以指定连接表。

has_and_belongs_to_many :travels, :join_table => :travels_tags

而且

has_and_belongs_to_many :tags, :join_table => :travels_tags

继承人从文档的一些信息,以帮助解释连接表命名的defsult行为。 “

”默认情况下,连接表的名称来自按字母顺序提供给create_join_table的前两个参数的联合。“

http://edgeguides.rubyonrails.org/active_record_migrations.html#creating-a-join-table

+0

非常感谢您的回答,它工作得很好!我将你的答案标记为已接受! –