2014-07-12 3 views
0

사용자와 관련된 질의에 액세스하면 질의 목록이 반환되지 않고 빈 배열이 반환됩니다.레일스 has_many 연관은 빈 배열을 반환합니다.

예를 들어

:

user = User.first 
    => [valid user] 
    i = Inquiry.first 
    => [valid inquiry] 
    i.user = user 
    user.inquiries 
    => #<ActiveRecord::Associations::CollectionProxy []> 

내 세 가지 모델 :

user.rb

class User < ActiveRecord::Base 
    devise :database_authenticatable, :registerable, 
     :recoverable, :rememberable, :trackable, :validatable 

    has_many :clients 
    has_many :inquiries 
end 

client.rb

class Client < ActiveRecord::Base 
    belongs_to :user 

    validates :user_id, :name, presence: true 
end 

inquiry.rb

,536,
class Inquiry < ActiveRecord::Base 
    belongs_to :user 

    validates :user_id, :client_name, presence: true 
end 

클라이언트 및 문의 모델에는 마이그레이션 파일 내에서 t.references, index : true가 있습니다.

+0

에 대한 확인? – mdenomy

+0

지금은 레일 콘솔에 그들을 만들고 있습니다. 그래서 저는 무언가를하고 있습니다. Inquiry.new, i.name = "Joe", i.user = user, i.save. – Casey

답변

1

콘솔에서 실험 중이므로이 같은 것을 시도하십시오.

user = User.first 
user.inquiries.create(whatever the params are for inquiry) 

user.inquiries # will return the inquiries, which for now is just the one in an array. 

밖으로 http://guides.rubyonrails.org/association_basics.html#has-many-association-reference 대한 추가 정보를 귀하의 문의를 만드는 방법/

+0

그래, 그뿐 이었어. 그래서 새로운 질의를 만들기 위해 위의 방법을 사용할 필요가 있습니까? 내 모델에 inverse_of 관계를 설정하지 않으면 inquiry.user = user, then inquiry.save를 사용할 수 없습니까? – Casey

+0

그것은 한 가지 방법입니다. inverse_of를 사용하지는 않았지만 다른 옵션처럼 보이는 문서는 보지 않았습니다. 가장 좋은 방법은 워크 플로와 개체 생성 방법에 따라 다릅니다. – mdenomy

+0

IMO, 불필요하게 데이터베이스에서 객체를 다시로드하지 않으려면 항상 inverse_of 관계를 설정해야합니다. 항상 발생하는 것은 아니지만 때로는 그렇게되며 데이터베이스를 낭비하는 이유는 무엇입니까? 그러나 여기에 제공된 대답은 메모리 내 개체 그래프를 만드는 올바른 방법입니다. 이 방법을 사용하십시오. 내 대답은 제시된 문제에 맞춰졌으며 이보다 더 큰 그림이 아닙니다. – pdobb

2

:inverse_of 메서드를 사용하여 레일을 조금만 벗어나면 도움이 될 수 있습니다. 그래서 다음과 같이 당신의 연결을 정의

class User < ActiveRecord::Base 
    has_many :inquiries, inverse_of: :user 
end 

class Inquiry < ActiveRecord::Base 
    belongs_to :user, inverse_of: :inquiries 
end 

당신은 :inverse_of 옵션에 사용되는 값이 관련된 모델의 연결 이름에 해당 것을 알 수 있습니다. 이 방법 레일은해야 허용 역 모델에 대한 그 관계를 확인하기 위해 알고 정확히 :

:inverse_of 옵션에 대한 자세한 검색, 다음 링크를 들어
u = User.first 
i = Inquiry.first 
i.user = u 
u.inquiries # => [i] 

inverse_of에 대한 :

  1. http://apidock.com/rails/ActiveRecord/Associations/ClassMethods/belongs_to
  2. http://apidock.com/rails/ActiveRecord/Associations/ClassMethods/has_many
+0

감사합니다. 하지만 왜 내 클라이언트 모델이 "inverse_of"메서드없이 제대로 작동합니까? user.first, user.clients라는 사용자를 수행하고 해당 사용자와 관련된 모든 클라이언트를 나열 할 수 있습니다. user.inquiries가 동일한 기본 구조이지만 inverse_of가 필요하다는 것은 이상한 일입니다. – Casey

+0

'u = User.first'는 User 객체를 메모리에로드하기 때문에 다릅니다. 그런 다음'i = Inquiry.first'는 Inquiry 객체를 메모리에로드합니다. 그래서'i.user = u'는 메모리 내 객체'i' 객체에 사용자'u'와 연관시키는 방법을 알려주지 만, 메모리 내'u' 객체는 기본적으로 그 반대의 것을 알지 못합니다. 왜 그랬을까요? 이제 표준 객체 메소드가 어떻게 작동합니다. 'inverse_of '를 사용하면 메모리 내 객체가 메모리와의 상호 관계를 방금 연결된 객체로 되 돌린다. – pdobb

+0

감사합니다. pdobb에게 감사드립니다. – Casey

관련 문제