2017-10-24 5 views
1

그래서 저는 Ruby on Rails를 처음 경험했습니다. 이것은 두 번째 달이지만, 여전히 나에게 이상한 일이 있습니다. 어떤 경우에는 다음을 할 수 있습니다.FK 열 이름이 레일에 엉망이되었습니다.

link.url = url 

여기서 클래스 링크는 URL 클래스와 FK가 있습니다. 그러나 내가 어떤 경우에는, 경우 :

ActiveModel::MissingAttributeError: can't write unknown attribute `equipment_id` 

가 왜 이런 일이 :

equipment.category = category 

레일즈 말, 불평하기 시작? 내가 가진 때마다 그것을 내가 한 참고 문헌에 대한 테이블의 일부 내용을 변경해야 할 일 :

add_reference :equipment, :category, foreign_key: true 

그래서 첫 번째 예제 같은 모든 클래스/테이블 동작을 할 수 있습니까?

편집 1 :

종류와 장비에 대한 나의 스키마는 이것이다 :

create_table "categories", force: :cascade do |t| 
    t.string "name" 
    t.datetime "created_at", null: false 
    t.datetime "updated_at", null: false 
end 

create_table "equipment", force: :cascade do |t| 
    t.string "title" 
    t.text "description" 
    t.datetime "created_at", null: false 
    t.datetime "updated_at", null: false 
    t.integer "category_id" 
    t.index ["category_id"], name: "index_equipment_on_category_id" 
end 

편집 2 클래스의 연관성이 있습니다

class Category < ApplicationRecord 
    # Associations 
    has_many :equipment 
    ... 

class Equipment < ApplicationRecord 
    # Associations 
    has_one :category 
    ... 
+1

'db/schema.rb'의 관련 부분을 보여줄 수 있고 'Equipment' 모델에서 어떻게 연결을 설정 했습니까? 나는 그 모델의 테이블 이름이'장비 '(복수형)라고 기대한다. 그렇다면 마이그레이션 문은'add_reference : equipments, : category, foreign_key : true'이어야합니다. – hoffm

+1

테이블 이름은 실제로 '장비'입니다. 나는 스키마를 보여줄 수 있도록 질문을 편집 할 것이다. – olegario

+1

스키마를 포함 해 주셔서 감사합니다. (하지만 코드를 이미지가 아닌 텍스트로 공유하십시오.) 모델에 has_one/belongs_to 연관을 표시 할 수 있습니까? – hoffm

답변

2

당신을 그 클래스에 대해 belongs_to을 사용하고 싶습니다.

class Category < ApplicationRecord 
    # Associations 
    has_many :equipment 
    ... 

class Equipment < ApplicationRecord 
    # Associations 
    belongs_to :category 
    ... 

equipment이 레일에서 자신의 복수의 - 그것은 an irregularly inflected noun 때문에 당신은 또한 몇 가지 문제로 실행 될 수 있습니다 외래 키, SP이야. 테이블/모델을 위해 그런 종류의 단어를 사용하는 것은 종종 나를위한 시행 착오와 관련이 있으며 궁극적으로 그것이 가치가있는 것보다 더 어려울 수 있습니다.

+0

'장비 '에 대해'equipment' 테이블을 마이 그 레이션하여 이름을 바꾸었지만 이제 Ruby가 말합니다 :'ActiveRecord :: StatementInvalid : 테이블을 찾을 수 없습니다'장비 ' ' – olegario

+1

네, 테이블 이름을 찾기 위해'Equipment' 모델에게''장비''를 말할 필요가 있습니다. 기본적으로''equipment "."라고 평가되는 테이블 ".pluralize"를 찾을 것입니다. 모델에서 이것을하십시오 :'self.table_name = "equipments"'. (문서 : http://api.rubyonrails.org/classes/ActiveRecord/ModelSchema/ClassMethods.html#method-i-table_name) 가장 간단한 경로 (다른 모든 경로는 다른 이름)는 다른 이름을 모두 선택하는 것입니다. – hoffm

+0

"장비"라는 표를 사용하면 굴절 장치의 목적을 모두 무효화하고 굴절 장치가 예방하도록 설계된 열악한 영어를 나타냅니다.깨진 영어를 지원하기 위해 추가 구성을 추가해야한다는 사실은 매우 나쁜 생각입니다. –