0

我正在研究Rails 5項目,並且有一個稱爲Upvote的模型,它是多態的,屬於事件或建議。我試圖專門抓取屬於一個類別或另一個類別的upvotes以及創建事件/建議的人的用戶標識,但由於多態性而掙扎。幾年前有a similar post,但是當我嘗試實施這項技術時,它並沒有奏效。具體來說,我將此代碼添加到我的給予好評型號:使用包含嵌套多態關聯

belongs_to :suggestion, -> { where(upvotes: {idea_type: 'Suggestion'}) }, foreign_key: "idea_id" 

但是當我嘗試像

Upvote.includes(:suggestion).last 

在控制檯中我得到這個錯誤:

ActiveRecord::StatementInvalid: PG::UndefinedTable: ERROR: missing FROM-clause entry for table "upvotes" 
LINE 1: SELECT "suggestions".* FROM "suggestions" WHERE "upvotes"."i... 

任何人都可以請幫助?謝謝:)

回答

1

在Rails5,belongs_to在默認情況下... 因此,一個required: true條款,它總是會檢查,如果計數器部分存在......並沒有has_many :upvote關係上Suggestion ...

要不需要櫃檯部分,你可以選擇optional: true添加到您的belongs_to條款

belongs_to :suggestion, -> { where(upvotes: {idea_type: 'Suggestion'}) }, foreign_key: "idea_id", optional: true 

OBS1

我剛剛因爲這個問題而在Rails上啓動了一個Pull請求,在this discussion上,我們發現實際上如果你不希望belongs_to默認爲required: true,那麼你可以配置這個行爲來設置config:

Rails.application.config.active_record.belongs_to_required_by_default = false 

上Rails5的全新安裝設置爲true,但沒有爲應用程序設置那裏遷移到Rails5

+0

感謝 - 是確定添加的多態模塊本身上的has_many?這不是我的錯誤,我不認爲,除非這條線必須在建議上,而不是建議has_many中包含的Upvotable模塊:upvotes,as :: idea,dependent :: destroy' – flaurida

+0

只有當您將其範圍對於'idea_type =='Suggestion'',但你仍然需要belongs_to作用域...或者upvote會在嘗試保存類型爲Event的事件時引發錯誤 – cefigueiredo