无法使其所属的模型也可以是has_many

时间:2015-10-19 06:38:04

标签: ruby-on-rails

当谈到拥有一个联合表时,我很挣扎,这个表也是多态的,有很多对很多。

它以一种问题属于公司的方式进行设置。问题可以通过question_participants(多态/联合)属于用户,组或公司。

现在,我可以在选择时保存用户和组,但不保存公司。我认为这与它作为所有者的混淆有关。

# ask question
class QuestionsController < ApplicationController


  def new
    @question = current_user.company.questions.new
  end

  private

  def question_params
    params.require(:question).permit(:name, :optional,
                                     user_ids: [], group_ids: [])
  end


# company users belong to
class Company < ActiveRecord::Base    
  has_many :questions
end


# questions created by admin
class Question < ActiveRecord::Base
  belongs_to :company
  has_many :question_participants
  has_many :answers
  has_many :users, through: :question_participants,
                   source: :questionable, source_type: 'User'
  has_many :groups, through: :question_participants,
                    source: :questionable, source_type: 'Group'
  has_many :companies, through: :question_participants,
                       source: :questionable, source_type: 'Company'
end

和表单字段:

<%= form_for @question do |f| %>

    <%= f.label :group_ids %>
    <%= f.collection_select :group_ids, current_user.company.groups.order(:name), :id, :name, {},
      { multiple: true } %>

    <%= f.label :user_ids %>
    <%= f.collection_select :user_ids, current_user.company.users.order(:first_name), :id, :first_name, {},
    { multiple: true } %>

    <%= f.label :name %>
    <%= f.text_field :name, class: "form-control" %>


  <%= f.submit class: "btn btn-success" %>

<% end %>

1 个答案:

答案 0 :(得分:0)

如果问题只是公司在Question类上显示两次作为字段,只需将Question类底部的has_many行更改为:

has_many :questionable_companies, through: :question_participants, 
                                  source: :questionable, source_type: 'Company'

如果有效,那太好了!否则....

我对多态性知之甚少,但据我所知,这就是我认为可行的方法:

用户,集团和公司应该有这一行:

has_many :question_participants, as: questionable

问题应该使用范围而不是您拥有的三条线。试试这个:

has_many :questionable, through: :question_participants

一旦你得到:问题可以作为问题的字段,那么你可以制作范围

scope :questionable_users, -> { where(questionable_type: :User) }
scope :questionable_groups, -> { where(questionable_type: :Group) }
scope :questionable_companies, -> { where(questionable_type: :Company) }

我在每个范围之前设置了questionable_,以便公司协会不会抱怨。

我完全忘记了范围与belongs_to的比较,但它可能会遗漏您想要的某些功能。