1

这对我来说是一个脑筋急转弯,但希望对更有经验的人来说很清楚。无法整理出正确的关联。

我有三个模型:用户、收件人、讨论

现在关联是这样建立的:

讨论

belongs_to :user
has_many :recipients

用户

has_many :discussions, dependent: :destroy
has_many :discussions, :through => :recipients

接受者

belongs_to :user, dependent: :destroy
belongs_to :discussion, dependent: :destroy

当我尝试在讨论控制器中使用此操作创建讨论时:

def create
  @discussion = current_user.discussions.build(params[:discussion])
  @discussion.sent = !!params[:send_now]

  if params[:subscribe_to_comments]
    CommentSubscriptionService.new.subscribe(@discussion, current_user)
  end

  if @discussion.save
    redirect_to @discussion, notice: draft_or_sent_notice
  else
    render :new
  end
end

我收到此错误:

Could not find the association :recipients in model User

我还没有创建保存收件人的操作。

希望你的回答能帮助清除这第一个问题的蜘蛛网,即关联,然后我将继续下一个问题。欢迎任何建议。

4

2 回答 2

1

看起来错误是正确的;您缺少User模型中的收件人关联。

您的用户模型需要了解接收者模型才能使用has_many :through

尝试将此添加到您的用户模型中:

has_many :recipients

编辑:实际上,根据您的问题,我不完全确定您希望如何布置模型。您也应该只has_many :discussions在您的用户模型中调用一次。

你的桌子是怎么布置的?您是要为 User: 执行此操作has_many :recipients, :through => :discussions吗?

编辑2:

好吧,从您的评论来看,我认为用户不需要有很多收件人。因此,在基本层面上,只需删除第二行,使您的用户模型看起来像:

has_many :discussions, dependent: :destroy

您可能还需要删除belongs_to :user收件人模型中的 。

于 2013-07-12T18:09:49.603 回答
1

另一个潜在的解决方案是像这样概述您的模型:

class Discussion
  has_many :participants
  has_many :users, :through => :participants

  def leaders
     users.where(:leader => true) # I think this should work: http://www.tweetegy.com/2011/02/setting-join-table-attribute-has_many-through-association-in-rails-activerecord/
  end
end


class Participant
  belongs_to :user
  belongs_to :discussion
  # This class can have attributes like leader, etc.
end

class User
  has_many :participants
  has_many :discussions, :through => :recipients

  def leader?(discussion)
    participants.find_by(:discussion_id => discussion.id).leader? # doesn't seem super elegant
end

使用此解决方案,所有用户都作为讨论的参与者保持在一起,而不是一个领导者有多个接收者。不过,在实施了其中一些之后,我不确定结果如何:P 我会继续发布它,但您应该自己做出明智的决定。

我不是专家;这只是模型布局方式的另一种选择。如果您有任何问题,请告诉我。我希望这有帮助!

于 2013-07-12T18:56:47.173 回答