Rails-Has_many关系不保存用户或组ID

时间:2016-06-16 05:55:23

标签: ruby-on-rails

我有一个用于与Assignments模型绑定的用户和组模型。用户拥有多个组和一组has_many用户。但是,当我创建一个新组时,当我Group.last.users.count输出为0或ActiveRecord :: Associations :: CollectionProxy []时。我是否需要更改simple_form的一个方面?我没有正确构建中间人模型来绑定用户和组吗?我希望这样当用户创建一个组时,group_ids在执行User.last.groups等时就在数组中。当我将它作为用户has_many组和一个group belongs_to用户时,组ID将绑定到一个用户。但是,既然为两个模型切换到has_many并引入了Assignments模型,那就不再是这种情况了。

群组模型

class Group < ActiveRecord::Base
  validates :user_id, presence: true   

  has_many :assignments
  has_many :users, through: :assignments
  has_many :posts
  has_many :attachments
  has_secure_token

end

用户模型

class User < ActiveRecord::Base
 ...
 has_many :assignments
 has_many :groups, through: :assignments
 accepts_nested_attributes_for :assignments
 ...

作业模式

class Assignment < ActiveRecord::Base
  belongs_to :group
  belongs_to :user

  accepts_nested_attributes_for :group
  accepts_nested_attributes_for :user
end

群组控制器

class GroupsController < ApplicationController
    before_action :authenticate_user!

def new
    @group = current_user.groups.build
end

def create
    @group = current_user.groups.build(group_params)
    @group.user_id = current_user.id
    if @group.save
        redirect_to groups_path
    else
        render :new
    end
end

private

  def group_params
    params.require(:group).permit(:group_name, :description, :user_id)
  end

end

分组new.html.erb

<%= simple_form_for @group do |f| %>
  <%= f.input :group_name %>
  <%= f.text_area :description %>
  <%= f.button :submit %>
<% end %>

1 个答案:

答案 0 :(得分:2)

你可以这样做:

我想build方法似乎没有保存您可以使用new的joiner模型。有一个问题here

由于GroupUser之间存在多对多关系。因此,组中不需要user_id。因此验证是不必要的。它导致了我的第一种方法的问题。在模型评论中验证。 # validates :user_id, presence: true

def create
    @group = current_user.groups.new(group_params)
    # @group.user_id = current_user.id // this line is unnecessary
    if @group.save
        redirect_to groups_path
    else
        render :new
    end
end

或者,(我不会建议它,因为它不是一个好方法)

def create
    @group = Group.new(group_params)
    if @group.save
        current_user.groups << @group
        redirect_to groups_path
    else
        render :new
    end
end