2015-06-04 51 views
0

獲得以下錯誤味精同時節省了一個答案:Mongoid ::錯誤:: MixedRelations在AnswersController#創建

問題:通過關係協會引用從用戶文檔(n)的回答文檔就再也沒有應答允許被嵌入。簡介:爲了正確訪問來自用戶的(n)答案,參考資料需要經過答案的根文件。在一個簡單的情況下,這需要Mongoid爲根存儲一個額外的外鍵,在更復雜的情況下,Answer是多層次的,需要爲每個父級在層次結構上存儲一個鍵。解決方案:考慮不嵌入Answer,或者在應用程序代碼中以自定義的方式執行密鑰存儲和訪問。

以上錯誤是由於在AnswersController中的代碼@ answer.user = current_user

我想保存登錄用戶名到被問題的答案。

deivse用戶模型:

class User 
    include Mongoid::Document 
    has_many :questions 
    has_many :answers 

class Question 

    include Mongoid::Document 
    include Mongoid::Timestamps 
    include Mongoid::Slug 

    field :title, type: String 
    slug :title 

    field :description, type: String 
    field :starred, type: Boolean 

    validates :title, :presence => true, :length => { :minimum => 20, :allow_blank => false } 

    embeds_many :comments 
    embeds_many :answers 

    #validates_presence_of :comments 

    belongs_to :user 

end 

class Answer 

    include Mongoid::Document 
    include Mongoid::Timestamps 

    field :content, type: String 

    validates :content, :presence => true, :allow_blank => false 

    embedded_in :question, :inverse_of => :answers 

    #validates_presence_of :comments 

    belongs_to :user 

end 

class AnswersController < ApplicationController 

    def create 
    @question = Question.find(params[:question_id]) 
    @answer = @question.answers.create(params[:answer].permit(:answerer, :content)) 
    @answer.user = current_user 
    redirect_to @question, :notice => "Answer added!" 
    end 
end 

使用Rails 4,紅寶石2.2.2,Mongoid。

+0

你提到':在你的控制器answerer',但我沒有看到這個在您的模型。此外,我不明白爲什麼你的答案模型中有'user_id'? –

回答

1

這正是錯誤信息所說的。

您的答案模型嵌入在問題模型中。也就是說,你只能在Question文檔上執行「普通」查詢,而不能在嵌入在這個模型中的模型上(實際上你可以,但它更困難,並且以某種方式殺死使用嵌入式文檔)。

因此,您可以讓用戶獲得給定的答案,但不是您在用戶模型中聲明的相反方向。

最簡單的解決方案是從用戶模型中刪除has_many :answers,但是如果您想檢索給定用戶的答案列表,那麼嵌入模型可能不是最佳解決方案:您應該有關係模型。

爲了把事情說清楚,你應該寫belongs_to :user, inverse_of: nil

+0

謝謝。修改後建議您修改錯誤。但是current_user沒有被保存在嵌入式答案文檔中。不知道我錯過了什麼! – ravi

+0

那是因爲你沒有保存它。當你執行'@answer = @ question.answers.create(params [:answer] .permit(:answerer,:content))'時,'.create'會保存你對數據庫的修改(就像調用''一樣。新「和」.save「)。所以你想在設置答案的用戶 –

+0

之後調用'@ answer.save'。明白了。非常感謝。 – ravi