2014-07-12 73 views
0

訪問與用戶關聯的查詢不返回查詢列表,而是返回空白數組。Rails 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

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

好吧,那也工作得很好。所以要創建一個新的查詢,我需要使用上述方法?我不能使用inquiry.user = user,然後是inquiry.save,除非我在模型中設置inverse_of關係? – 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選項一起使用的值等於關聯的模型的關聯名。這樣,導軌知道檢查逆模型的關係,應該允許正是這一點:

u = User.first 
i = Inquiry.first 
i.user = u 
u.inquiries # => [i] 

欲瞭解更多的:inverse_of選項,搜索以下鏈接爲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 = User.first,user.clients並列出與該用戶關聯的所有客戶端。 user.inquiries是相同的基本結構,但需要inverse_of,這很奇怪。 – Casey

+0

因爲u = User.first將User對象加載到內存中,所以它不同。然後'i = Inquiry.first'將查詢對象加載到內存中。因此,'i.user = u'告訴內存中的對象'i'對象如何與用戶'u'相關,但是默認情況下內存中的'u'對象沒有被告知相反的情況。爲什麼呢?這就是你的標準對象方法的工作原理。使用'inverse_of'告訴內存中的對象建立一個與它剛剛關聯的對象相反的內存關係。 – pdobb

+0

這很有道理,謝謝pdobb。 – Casey