Rails:通过表单中的对象ID数组进行has_many关联

时间:2017-07-15 20:24:18

标签: javascript ruby-on-rails arrays ruby activerecord

我有Group has_many的模型Users

class Group < ApplicationRecord
  belongs_to :user
  has_many :users
  serialize :user_ids, Array
end

我在前端使用JS将User ID添加到数组user_ids。隐藏字段看起来像这样:

 = f.hidden_field :user_ids, id: "ids_field"

选择几个用户,将它们添加到JS数组并将隐藏字段的值分配给t hat数组后,我使用强params(使用user_ids作为数组)从params创建一个新对象:< / p>

@group = Group.new(group_params)
def group_params
  params.require(:group).permit(:name, :user_id, :user_ids=>[])
end

日志显示以逗号分隔的列表中的user_ids提交:

Processing by GroupsController#create as JS

Parameters: {"utf8"=>"✓", "group"=>{"name"=>"", "user_ids"=>["25,1"]}, "commit"=>"Save Squad"}

检查控制台中的Group表示只有数组中的第一个ID 被分配给该组。

irb(main):128:0> Group.last.user_ids
..
[
    [0] 25
]

过去两天,我一直在抨击这个问题,但是根本无法让它发挥作用。我尝试过各种变化: - 在前端使用JSON - 删除后端的序列化 - 使用.split(“,”)拆分数组参数 - 使用group_params,包括/排除user_ids上的“=&gt; []”,并在我的隐藏字段中添加显式名称。通常我会在这里得到一个不允许的参数错误。 - 使用Group.users将数组分配给组模型&lt;&lt; ....

非常感谢任何帮助或指导。我觉得我已经在某些时候得到了所有部分,只是不是在同一时间。如果我完全离开并且有更好的方法来做到这一点,我已经准备好抛弃这个并继续前进。

提前谢谢你:)

编辑:更多的游戏向我展示了user_ids数组确实是一个数组,但只包含一个条目:“25,1”。我通过取params[:user_ids][0]并用逗号分隔符拆分,循环索引,并将每个用户保存到组关联来解决我的问题。我不认为这是一个很好的解决方案,仍然希望在没有操纵的情况下通过直线阵列。

2 个答案:

答案 0 :(得分:1)

这似乎是经典的Has和属于许多情况,因为用户可以&#34;拥有&#34;一个组,属于许多组。我会按照以下方式做点什么:

class Group < ApplicationRecord
  belongs_to :user
  has_many :users_groups
  has_many :users, through: :users_groups
  accepts_nested_attributes_for :users
end

Class User < ApplicationRecord
  belongs_to :group
  has_many :users_groups
  has_many :groups, through: :users_groups
  accepts_nested_attributes_for :groups
end
终端中的

创建迁移:

rails g migration CreateUsersGroupsJoinTable用户组

这将创建一个包含列的连接表:

|id|user_ids|group_ids|

这可以获得各种各样的Rails方法,如:

u = User.find(1)
 #returns user with ID 1

u.groups
 #will a result of joining Group with UsersGroups ON groups.id = users_groups.group_id WHERE users_groups.user_ids = 1

你也可以这样做:

g = Group.find(1)

g.users
 #returns all user objects that belong to that group.

然后当你在进行表单时,它会为你提供像collection_check_boxes这样的东西,它会根据Group.all或User.all之类的东西自动构建复选框,返回一个自动更新连接表并完成所有操作的数组这项工作看起来像你在做JS。

答案 1 :(得分:0)

尽管有答案,但我认为真正的问题是

"user_ids"=>["25,1"]

应该是

"user_ids"=>["25", "1"]

在前端,我使用JS组合逗号分隔的字符串,例如

"25,1"

在控制器中,我使用Ruby将其解析为数组

params[:user_ids].split(",").uniq

我可以将其分配给实例。 Rails将创建关联。

group.user_ids = params[:user_ids].split(",").uniq