2017-05-21 15 views
0

自分のコードで自己参照関連付けを作成する際に問題があります。一般的に私は様々なワークショップのカテゴリがあり、そのカテゴリには別のカテゴリが必要な場合があります(2番目に登録するには最初のカテゴリを終了する必要があります)。私は私のモデルについては、以下のコードを持っている:自己結合されたRailsテーブルでは、一方向の関連付けのみを追加できます

class WorkshopCategory < ApplicationRecord 
    has_many :category_requirements, foreign_key: 'category_id', class_name: 'CategoryRequirement' 
    has_many :requirements, through: :category_requirements 
end 

class CategoryRequirement < ApplicationRecord 
    belongs_to :category, foreign_key: 'category_id', class_name: 'WorkshopCategory' 
    belongs_to :requirement, foreign_key: 'requirement_id', class_name: 'WorkshopCategory' 
end 

とそのテーブルのマイグレーションを次

class CreateWorkshopCategories < ActiveRecord::Migration[5.0] 
    def change 
    create_table :workshop_categories do |t| 
     # some fields for workshop_categories 
    end 
    end 
end 

class CreateCategoryRequirements < ActiveRecord::Migration[5.0] 
    def change 
    create_table :category_requirements do |t| 
     t.integer :category_id, index: true 
     t.integer :requirement_id 
    end 
    end 
end 

私はいくつかの種を作成し、私は次のような問題があります。

WorkshopCategory.find(2).requirements.create(requirement_id: 1) 

結果ではエラー 'ActiveModel :: UnknownAttributeError:不明な属性' requirement_id 'for WorkshopCategory'。

中:次に

CategoryRequirement.create(category_id: 2, requirement_id: 1) 

が作品適切とWorkshopCategory.find(2)も適切にその要件として、ID 1のWorkshopCategoryを返し.requirements。

私は初心者ですが、両方の方法が正しく動作するはずです。はいの場合、私のコードに何が問題なのですか?なぜWorkshopCategory.find(2).requirements.create()がCategoryRequirementではなくWorkshopCategoryモデルで動作するのですか?

+0

は、あなたのカテゴリと要件のクラスを追加します。 – hashrocket

+0

私はそのようなクラスを持っていません、命名時の指定は私のコードの他のクラスによって指示されますが、まだ依存関係はありません。 "WorkshopCategory"をCategory.rb、 "CategoryRequirement"を "Requirement.rb"として扱うことができます – bochen421

+0

どのガイドを使用していますか? – hashrocket

答えて

0

基本的に、私は間違った前提を持っていました。

class Person < ActiveRecord::Base 
    has_many :friendships, :foreign_key => "person_id", 
     :class_name => "Friendship" 

    has_many :friends, :through => :friendships 
end 

class Friendship < ActiveRecord::Base 
    belongs_to :person, :foreign_key => "person_id", :class_name => "Person" 
    belongs_to :friend, :foreign_key => "friend_id", :class_name => "Person" 
end 

を、あなたがPerson.find(1).friendsを使用して、SBの友人にアクセスすることができますが、あなたはPerson.findを行うことはできません(1):私は、ここに提供される一つに基づいて私の団体コードをしました。 friends.create(friend_id:2)この場合、実際に新しい人物を作成しようとしますが、必要なのは友だちを作ることです。だから、関連付けを作成するための2つの方法上記のコードの場合には、次のとおりです。

Person.find(1).friendships.create(friend_id: 2) 
# and 
Friendships.create(person_id: 1, friend_id: 2) 

と私の場合には、これらは以下のとおりです。

WorkshopCategory.find(2).category_requirements.create(requirement_id: 1) 
# and 
CategoryRequirement.create(category_id: 2, requirement_id: 1) 
関連する問題