2016-07-03 3 views
0

연결은 내 레일 아킬레스 건입니다.콘솔에서 연결을 표시하는 방법 콘솔

나는 3 가지 모델과 컨트롤러가 있습니다 : User, List, Item.

사용자가 usernamepassword을 만들 수 있습니다. 목록을 만들 수 있습니다 name, 항목을 만들 수 있습니다. item_name

이상적인 목록은 사용자에게 속합니다. 항목이 목록에 속합니다. 목록에 많은 항목이 있습니다. 사용자는 많은 목록을 가지고 있습니다.

2.2.1 :005 > List.column_names 
=> ["id", "name", "user_id", "created_at", "updated_at"] 
2.2.1 :006 > Item.column_names 
=> ["id", "item_name", "list_id", "created_at", "updated_at"]  
2.2.1 :007 > User.column_names 
=> ["id", "username", "password", "created_at", "updated_at"] 

그래서 내가 새로운 사용자, 항목을 만들 가서 목록 :

class Item < ActiveRecord::Base 
    belongs_to :list 
    delegate :user, to: :list 
end 

class List < ActiveRecord::Base 
    belongs_to :user 
    has_many :items 
end 

class User < ActiveRecord::Base 
    has_many :lists 
    has_many :items, through: :lists 
end 

레일 콘솔에서 바로 확인하고, 나는 열을 확인 : 그래서 함께했다

User.create(username: "iggy2", password: "helloworld") 
#let's say iggy2 has user_id 2. 

iggy2에 "중요한 것들"이라는 이름의 목록이 있고 "설거지"항목이 있어야합니다.

List.create(name: "Important", user_id: 2) #let's say this has id of 1 

Item.create(item_name: "Wash dishes", list_id: 1) 

항목이 목록에 연결되어 있고 목록이 사용자에 연결되어 있다고 가정했습니다. 그러나 User.last.name을 입력하면 "중요"대신 "NoMethodError: undefined method 'name'"이 표시됩니다. 나는 또한이 내 코드에없는 무엇 내 스키마가

create_table "items", force: :cascade do |t| 
    t.text  "item_name" 
    t.integer "list_id" 
    t.datetime "created_at",     null: false 
    t.datetime "updated_at",     null: false 
    end 

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

    create_table "users", force: :cascade do |t| 
    t.string "username" 
    t.string "password" 
    t.datetime "created_at", null: false 
    t.datetime "updated_at", null: false 
    end 

모습입니다 List.last.item_name

에 유사한 오류가? 내 가정이 틀렸어? 마지막 사용자의 항목 이름 또는 목록 이름을 표시하려면 User.last.name 또는 User.last.item_name을 어떻게 얻을 수 있습니까?

답변

1

코드가 맞지만 가정이 잘못되었습니다. User.last은 사용자 레코드를 반환하므로 연결된 레코드의 메서드에 액세스 할 때 NoMethodError이 반환됩니다.

나는 당신이 원하는 아래 가정하자 :

List.where(user_id: User.last.id).pluck(:name) # Return all list names belong to last user 

id = List.find_by(user_id: User.last) 
Item.where(list_id: id).pluck(:item_name) # Return all item names belong to last user 
+0

그것은했다. 고맙습니다! 나는 단지 후속 질문을 생각했다. 나는 여전히 다형성을 배우고 있기 때문에 가능한지 확실하지 않지만 User.last.item_name 또는 User.last.name (name = list name) 명령을 사용하여 값을 반환 할 수 있습니까? (즉, 사용자에서 다른 관련 항목의 속성으로 직접 이동할 수 있습니까?) 또는 위 응답에서 언급 한 프로세스를 따라야합니까? 정말 고맙습니다! – Iggy

+0

확실하게 다형성 연관을 적용 할 수 있습니다. 즉,'Item'은'User'와'List' 둘 다에 속할 수 있습니다. http://guides.rubyonrails.org/association_basics.html#polymorphic-associations는 좋은 예를 제시해야합니다. – kasperite