通过关系创建has_many的问题(​​Rails 4)

时间:2015-07-15 05:46:10

标签: ruby-on-rails ruby ruby-on-rails-4 activerecord web

这可能是一个初学者的问题,但它真的让我今晚难过。我有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" = ?

我已尝试创建迁移以手动将外键添加到模型但无法使其工作。任何帮助将不胜感激。

3 个答案:

答案 0 :(得分:3)

如何处理abhinavmsra指出的另一种方法是,在ActiveRecord重放中,您可以通过class_name选项指定模型与之相关的类。因此,您需要将class_name选项添加到UserPlay模型中。

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