#6 楼 @qinfanpeng 我就是设计师,我在尝试写一个运维平台,我是做运维的,这种用法在资产管理系统或者监控系统中都是很常见也很方便的。截两个图给你看看,这两个的实现方式都是 select。 这个是国产运维资产管理系统 jumpserver,可以往主机组里添加主机,这种做法就很方便。比如主机很多的时候,再提供一个搜索框 这个是开源监控系统 zabbix 的界面。
@qinfanpeng @leiz_me 这应该是一个很普遍的需求,用来更新 many-to-many 的数据,右边是待选的选项,只要将选项移动到左边的选择框,就可以提交了,有很多系统都是这样搞的。
#3 楼 @killernova 我的想法是在提交表单的时候用 js 将所有的值都改为 selected,这样值就能传过去了。
#1 楼 @qinfanpeng 多谢大侠,已用 jquery 实现,但还有一个问题,请移步: https://ruby-china.org/topics/29746 移动函数:
function test(from_select,to_select) {
$('#' + from_select +' option:selected').each(function() {
var newOption= new Option($(this).text(),$(this).val());
$(this).remove();
$("#" + to_select ).append(newOption);
}
);
#3 楼 @qinfanpeng 搞定了:
<%= f.select(:group_ids, options_from_collection_for_select(@groups, "id", "groupname") , {include_hidden: false}, {:class => 'form-control',:multiple => true}) %>
options_from_collection_for_select(@groups, "id", "groupname") 这个确实可以直接从 model 对象生成想要的数组,然后 option 里的 include_hidden: false 则可以去掉多出的一个“”
Note: The client either sends only the hidden field (representing the deselected multiple select box), or both fields. This means that the resulting array always contains a blank string.
In case if you don't want the helper to generate this hidden field you can specify include_hidden: false option.
更新的话,可以先试 params 获取到表单数据,然后 update 即可。
def update
@host=Host.find(params[:id])
if @host.update(host_params)
redirect_to @host
else
render 'edit'
end
end
private
def host_params
params.require(:host).permit(:public_ip, :privite_ip, :server, group_ids: []) #获取数组的方式需要特别对待
end
#1 楼 @qinfanpeng ,多谢哈 1,我查了下,:prompt 是给 select 框显示一个提示符,而且还属于 select 中的一个元素。 2,我那种方法是可以直接保存关联关系到 groups_hosts 表中的。 然后我尝试给 select 传递的参数不是 id,而是 Group 实例,如下:
#controller
@group_list=Group.all.collect { |g| Array.new << g.groupname << g }
#view
<%= f.select(:groups, @group_list, {}, {:class => 'form-control',:multiple => true}) %>
但这这时候 params[:host][:groups] 获取到的却是 String 类型的,还是没法保存
#8 楼 @linyunjiang 嗯,多谢,我也觉得 view 里写查询不好,可是这不是刚入门嘛,就先瞎试呢,看看都能干嘛。 多谢你的分享哈。
#6 楼 @awking 嗯,看到了,确实执行了两个 sql,
Group Load (0.2ms) SELECT "groups".* FROM "groups"
Host Load (0.2ms) SELECT "hosts".* FROM "hosts" WHERE "hosts"."group_id" IN (1, 2)
可是,这个时候的@groups是 Group 的集合,我该怎么得到 Host 的集合呢。 includes 应该是用在两个表之间的联合查询,比如查找特定 groups 里的所有 hosts,我是想如何在 view 中得到与 hosts 相关联的 groups 表的某些字段。
@hww @killernova 没有找到可以直接查询到同时包含两个表的字段的方法,倒是找到了一个比较笨的方法:
def index
@host=Host.all
@group=Group.all
然后 view 这里:
<td><%= @group.find(host.group_id).groupname %></td> #host为@host其中的一个元素.
@hww @killernova 多谢二位的热心回答,我查了下官方文档,includes 与之关联的对象加载进来,确实满足我的需求。 世界上我就是想在数据库中执行如下语句:
elect hosts.*,groupname from hosts JOIN groups on hosts.group_id=groups.id;
然后对象的 action 应该是:
@host=Host.joins('LEFT JOIN groups on hosts.group_id=groups.id')
但是这种方法得不到 groups 里面的任何字段,然后可以加上 includes 再试试:
@host=Host.joins('LEFT JOIN groups on hosts.group_id=groups.id').includes(:groups)
@host=Host.includes(:groups)
可是无论是怎么使用 includes,最终都会报错:
uninitialized constant Host::Groups
赞死啦