这可能是一个初学者的问题,但它真的让我今晚难过。我有3个模型:Play,User和Works_on
应用程序/模型/ play.rb
class Play < ActiveRecord::Base
has_many :works_on
has_many :users, through: :works_on, :foreign_key => 'user_id'
end
应用程序/模型/ user.rb
class User < ActiveRecord::Base
has_many :works_on
has_many :plays, through: :works_on, :foreign_key => 'play_id'
end
应用程序/模型/ works_on.rb
class WorksOn < ActiveRecord::Base
belongs_to :user
belongs_to :play
end
当我尝试运行时
<%= @play.users.each{|user| user.first_name } %>
在app / views / plays / show.html.erb中,我收到了错误
SQLite3::SQLException: no such column: works_ons.play_id: SELECT "users".* FROM "users" INNER JOIN "works_ons" ON "users"."id" = "works_ons"."user_id" WHERE "works_ons"."play_id" = ?
我已尝试创建迁移以手动将外键添加到模型但无法使其工作。任何帮助将不胜感激。
答案 0 :(得分:3)
如何处理abhinavmsra指出的另一种方法是,在ActiveRecord重放中,您可以通过class_name
选项指定模型与之相关的类。因此,您需要将class_name
选项添加到User
和Play
模型中。
has_many :works_on, :class_name => 'WorksOn'
答案 1 :(得分:1)
对于has_many关联,关联名称应为复数。 尝试替换
:works_on
与
:works_ons
答案 2 :(得分:0)
我只需要将外键添加到迁移中。不知道为什么这对我来说不起作用,但它最终起作用了。谢谢大家!
class CreateWorksOns < ActiveRecord::Migration
def change
create_table :works_ons do |t|
t.integer :play_id, null:false
t.integer :user_id, null:false
t.timestamps null: false
end
end
end