has_many通过has_one

has_many通过has_one

问题描述:

我有两个模型,ConversationMessage,和一个关注Conversible。 A Conversible有一个Conversation和一个Conversation有很多Message的。我想设置Conversible,所以我可以在我的Conversible上拨打messages,它将返回MessageConversation。这是我到目前为止:has_many通过has_one

module Conversible 
    extend ActiveSupport::Concern 

    included do 
    has_one :conversation, as: :conversible dependent: :destroy 
    has_many :messages, through: :conversation 
    end 
end 

class Message < ActiveRecord::Base 
    belongs_to :conversation 
end 

class Conversation < ActiveRecord::Base 
    belongs_to :conversible, polymorphic: true 
    has_many :messages, dependent: :destroy 
end 

不幸的是,这是行不通的。我可以拨打conversible.messages,但它总是返回一个空关系,即使conversible.conversation.messages返回与其Message的关系。

我错过了什么?

+0

你在哪里包含模块'Conversible'? – IS04 2014-09-04 19:14:23

+0

我们有四个其他模型,包括'可转换的'。例如,有一个“目标”模型应该有一个“对话”。我离开他们试图保持简单的问题。 – LandonSchropp 2014-09-04 23:29:35

看起来你并不需要Conversible模块:

class Conversation < ActiveRecord::Base 
    belongs_to :conversible, polymorphic: true 
    has_many :messages, dependent: :destroy 
end 

class Message < ActiveRecord::Base 
    belongs_to :conversation 
end 

,然后如果你需要Conversation有一定的关系,你可以写:

class Post < ActiveRecord::Base 
    has_many :conversations, as: :conversible 
end 

,或者你可以尝试像:

module Conversible 
    extend ActiveSupport::Concern 

    included 
    has_one :conversations, as: :conversible 
    has_many :messages, through: :conversations 
    end 
end 

然后:

class Post < ActiveRecord::Base 
    include Conversible 
end 
+0

对不起,我应该提到这是一个更大项目的样本。我们在应用程序中有多个模型,其中将包括'可转换的'以及其他将被添加到该问题中的方法。 – LandonSchropp 2014-09-04 23:29:58

+0

使用'as'修复了一个错误,但它没有解决问题。 – LandonSchropp 2014-09-04 23:33:06

+0

你的意思是第二个变体不起作用吗? – IS04 2014-09-05 06:07:37