2015-07-15 2 views
1

Это может быть новичок, но сегодня это действительно озадачило меня. У меня есть 3 модели: Play, пользователь и Works_onПроблемы, связанные с созданием has_many через отношение (Rails 4)

приложение/модели/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 } %> 

в приложение/просмотров/пьесах/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" = ? 

Я попытался создать миграцию вручную добавить внешние ключи к моделям, но не смогли получить его работать. Любая помощь приветствуется.

+1

Почему вы явно указываете внешний ключ, даже если вы сделали это с помощью соглашений RoR? Почему вы не предпочитаете ассоциацию has_and_belongs_to_many?, Если вы не хотите явно создавать объекты класса WorksOn? – RockStar

+0

Я хотел бы добавить атрибут (роль/ответственность) к отношению work_on. –

ответ

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 
1

Для ассоциации has_many имена ассоциаций должны быть множественными. Попробуйте заменить

:works_on 

с

:works_ons 
+0

Это не сработало для меня. Любые другие идеи? –

3

Другим способом, как лечить с тем, что abhinavmsra заостренное, что в ActiveRecord replationships вы можете указать класс, модель связана с помощью опции class_name. Таким образом, вы добавляете опцию class_name в модели User и Play.

has_many :works_on, :class_name => 'WorksOn' 
+0

К сожалению, это не работает для меня. Это дает ту же ошибку, никакой столбец work_ons.play_id –

Смежные вопросы