当谈到拥有一个联合表时,我很挣扎,这个表也是多态的,有很多对很多。
它以一种问题属于公司的方式进行设置。问题可以通过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 %>
答案 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的比较,但它可能会遗漏您想要的某些功能。