复杂has_many通过关联

时间:2013-07-12 18:06:28

标签: ruby-on-rails one-to-many

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

我有三种型号: 用户,收件人,讨论

现在协会的设置方式如下:

讨论

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

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

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

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

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

2 个答案:

答案 0 :(得分:1)

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

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

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

has_many :recipients

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

你的桌子是如何布置的?您是否要为用户执行此操作:has_many :recipients, :through => :discussions

编辑2:

好的,从您的评论中,我认为用户不需要拥有多个收件人。因此,在基本级别上,只需删除第二行即可使您的用户模型看起来像:

has_many :discussions, dependent: :destroy

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

答案 1 :(得分: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我会继续发布它,但你应该自己做出明智的决定。

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