我的代码:
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
我是新手,非常感谢您的帮助!谢谢! :)
答案 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”的列,该列不是有效类型。相反,您需要诸如string
,integer
,datetime
之类的东西。要引用另一个表,可以执行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