“rake db:migrate”时不断出现语法错误

Flexlutherr

我的代码:

class Song < ActiveRecord::Base
   belongs_to :artist
   has_many :song_genres
   has_many :genres, :through :song_genres
end

错误:

rake aborted!
SyntaxError: .../app/models/song.rb:4: syntax error, unexpected ':', expecting keyword_end
has_many :genres, :through :song_genres

当我使用“=>”时:

class Song < ActiveRecord::Base
  belongs_to :artist
  has_many :song_genres
  has_many :genres, :through => :song_genres
end

我不再收到错误消息,但现在我在一次迁移中收到类似情况的另一条错误消息。

rake aborted!
SyntaxError: .../db/migrate/01_create_artists_table.rb:4: syntax error, unexpected tSYMBEG, expecting keyword_end
                t.string :name

那里的代码如下所示:

class CreateArtistsTable < ActiveRecord::Migration
  def change
        create_table :artists |t|
        t.string :name
        t.has_many :songs 
        t.has_many :genres, through: :song_genres 
        end 
  end
end

我是新手,所以我非常感谢您的帮助!谢谢!:)

密主

你这里有两个问题。在您的模型中,关键字参数的语法是错误的。在 ruby​​ 中,您可以通过在关键字之后和值之前放置冒号来将参数作为关键字传递,就像 sokey: :value而不是:key :value单词前的冒号声明了一个符号,这不是您在这里所做的。所以,你的模型实际上应该是这样的:

class Song < ActiveRecord::Base
   belongs_to :artist
   has_many :song_genres
   # has_many :genres, :through :song_genres
   has_many :genres, through: :song_genres
   # Which is shorthand for `has_many :genres, :through => :song_genres`
end

而且,在您的迁移中,您不能指定through. 那是只存在于您的模型中的东西。您也有错误的迁移语法。它应该看起来更像这样:

create_table :table_name do |t|
  t.type :column_name
end

当您说 时t.has_many,您是在要求 ActiveRecord 创建一个类型为“has_many”的列,该列不是有效类型。相反,您需要类似stringintegerdatetime等的内容。要引用另一个表,您可以执行t.references因此,您的迁移应该更像这样:

class CreateArtistsTable < ActiveRecord::Migration
  def change
        create_table :artists |t|
        t.string :name
        t.<type> :songs 
        t.<type> :genres #, through: :song_genres 
        end 
  end
end

具体来说,考虑到您尝试创建的关系,它会更像这样:

class CreateArtistsTable < ActiveRecord::Migration
  def change
    create_table :artists |t|
      t.string :name
    end 
    add_reference :songs, :artist
    create_table :song_genres do |t|
      t.references :song
      t.references :genre
    end
  end
end

作为旁注,在 ruby​​ 中,您应该使用 2 个空格进行缩进。

本文收集自互联网,转载请注明来源。

如有侵权,请联系[email protected] 删除。

编辑于
0

我来说两句

0条评论
登录后参与评论

相关文章

来自分类Dev

使用ruby 1.9.3时运行'rake db:setup'时出现语法错误

来自分类Dev

Rake db:migrate捕获错误

来自分类Dev

奇怪的rake db:migrate输出

来自分类Dev

ExceptionNotifier和rake:db:migrate

来自分类Dev

rake db:migrate有什么错误?

来自分类Dev

rake db:migrate发生迁移错误

来自分类Dev

无法使用db Migrate,Rake中止错误

来自分类Dev

RoR:Rake db:seed错误

来自分类Dev

rake db:migrate由于rake版本差异而被中止

来自分类Dev

heroku运行rake db:migrate ... rake中止了!找不到Rakefile

来自分类Dev

在运行heroku rake db时遇到麻烦:migrate使rake中止!错误

来自分类Dev

rake db:migrate不会更改表

来自分类Dev

heroku运行rake db:migrate还原迁移

来自分类Dev

capistrano 3`rake db:migrate`仍然运行

来自分类Dev

rake db:migrate不创建表

来自分类Dev

rake db:migrate未创建用户表

来自分类Dev

如何使用Sidekiq运行Rake db:migrate

来自分类Dev

bundle exec rake db:migrate 来自哪里?

来自分类Dev

Bundle Exec Rake DB迁移错误

来自分类Dev

错误地命名迁移-rake db:migrate被拒绝

来自分类Dev

Heroku在rake db中拉出重复的列错误:migrate

来自分类Dev

Heroku在db:migrate rake上引发错误

来自分类Dev

rake db:migrate name错误未定义的方法

来自分类Dev

rake db:migrate失败。没有终端错误

来自分类Dev

Heroku在db:migrate rake上引发错误

来自分类Dev

rake db:migrate错误(正在进行迁移)

来自分类Dev

执行rake db:migrate时了解Rails的初始化

来自分类Dev

rake db:migrate即使在重置时也不执行任何操作

来自分类Dev

如何判断rake db:migrate和rake db:seed是否成功