当“ rake db:migrate”时,不断收到语法错误

时间:2018-08-12 16:11:43

标签: ruby activerecord migration syntax-error rake

我的代码:

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

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

3 个答案:

答案 0 :(得分:0)

您在这里遇到两个问题。在您的模型中,关键字参数的语法错误。在ruby中,您可以通过将冒号 放在关键字之后和值之前,将参数作为关键字传递,就像key: :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

请注意,在红宝石中,应该使用2个空格进行缩进。

答案 1 :(得分:-1)

create_table :artists |t|应该是create_table :artists do |t|

此外,以下两行不应包含在artists迁移中。他们错了。这不是在Rails中创建许多直通关系的方式。它们应该是模型的一部分,而不是迁移。

t.has_many :songs 
t.has_many :genres, through: :song_genres

Song模型中,将其编写为类似内容。

has_many :genres, through: :song_genres

song_genres表创建迁移,以建立具有许多尽管关联的关系。

create_table :song_genres do |t|
  t.belongs_to :songs
  t.belongs_to :genres
end

答案 2 :(得分:-1)

为您的第一条错误消息尝试以下语法:

has_many :genres, through: :song_genres