• #9 楼 @raecoo 👍,学习了,要的就是这个效果。 我目前是在提交表单的 submit 上增加事件:

    function select_all() {
      $("#host_group_ids").children().each(function() { 
        $(this).attr("selected","selected")
        }
      );
    };
    
  • #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 则可以去掉多出的一个 “”

    http://api.rubyonrails.org/classes/ActionView/Helpers/FormOptionsHelper.html#method-i-options_from_collection_for_select

    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 类型的,还是没法保存 😅

  • #12 楼 @hww 😓,终于找到原因了

    class Host < ActiveRecord::Base
        has_many :comments
        belongs_to :group
    end
    

    我这里以前写的是 belongs_to :groups ,然后 h.group.name 的时候一直不出来东西。 原来 belongs_to 后面的需要单数。😓 这块属于什么概念,怎么才能理解它呢。

    就是说 rails 创建 model 的时候都是以单数的形式去创建的,然后给建一个复数名字的数据表,然后维护表与表之间的关系也需要注意单复数,确实很贴切英语语法😓

  • #8 楼 @linyunjiang 嗯,多谢,我也觉得 view 里写查询不好,可是这不是刚入门嘛,就先瞎试呢,看看都能干嘛。 多谢你的分享哈 。

  • #7 楼 @riskgod 1#确实牛逼,说的这个方法我现在还没参透呢,😅

  • #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
    
  • 赞死啦