0

私は単純な todo アプリを実行しています。ここでは、todo モデルとタグ モデルのみがあり、それらの間に has_many_belongs_to_many 関係があります。また、次のような結合の todo_tags 移行も設定しました。

class CreateTodoTagsJoinTable < ActiveRecord::Migration
 def up
  create_table :todo_tags, :id => false do |t|
    t.integer :todo_id
    t.integer :tag_id
  end

    add_index :todo_tags, [:todo_id, :tag_id]
  end

  def down
   drop_table :todo_tags
  end
 end

しかし、タグまたは todo を削除しようとすると、タグと todo の間の接続をまだ設定していないにもかかわらず、次のエラーが表示されます。

Mysql2::エラー: テーブル 'wa2do.tags_todos' が存在しません: SELECT tags.* FROM tagsINNER JOIN tags_todosON tags. id= tags_todos. tag_idどこtags_todosで。todo_id= 298486374

Railsがtags_todosテーブルのアイデアをどこで取得したかはわかりませんが、移行中に私のテーブルがtodo_tagsと呼ばれていました。実際には演習であり、彼らはこの名前を使用するように要求しました.

次のような 2 つのモデルがあります。 Todo クラス Todo < ActiveRecord::Base attr_accessible :task_name, :due_date, :finished, :priority

 validate :task_name, :presence => true
 validate :due_date_in_future?

 has_and_belongs_to_many :tags

 def due_date_in_future?
  due_date > DateTime.current
 end

終わり

および Tag クラス Tag < ActiveRecord::Base attr_accessible :tag_name

  has_and_belongs_to_many :todos

  validates_uniqueness_of :tag_name, :on => :create, :message => "Tag name must be unique"

end

そして私のコントローラー

def destroy
  @todo = Todo.find(params[:id])
  @todo.destroy

  respond_to do |format|
    format.html { redirect_to todos_url }
    format.json { head :no_content }
  end
end
4

1 に答える 1

0

正解かもしれないものを見つけました。そしてその場合、必要のない多くのスルー関係を使用することによってのみ、それを好転させることができると思います。

テーブルはアルファベット順に名前を付ける必要があることに注意してください。つまり、storys_categories ではなく、categories_stories テーブルです。これが機能する規則です。

于 2013-03-24T11:18:58.023 に答える