1

召唤所有 Rails 超级英雄!我正在为此绞尽脑汁,无法在网上任何地方找到解决方案……我想建立年份/品牌/型号下拉列表,以从 30,000 多种不同汽车的表格中选择汽车。该表称为car_variants这是 kbb.org 上类似内容的链接

首先选择年份,然后使用该年份可用的内容填充Make下拉列表。这反过来会填充模型下拉列表。所有这些过滤都克服了在一个不可用的下拉列表中包含 30,000 个 car_variants 的可怕问题。

不幸的是,我没有足够的声誉来发布我的实体图,但基本上......

  • 一个 car_make 有很多 car_models
  • 一个 car_model 有很多 car_variants
  • 一个 car_year 有很多 car_variants

旁注 由于car_variants表将通过导入 excel 电子表格来填充,因此我决定直接将 car_year 加入 car_variants,而不是说 car_year 有很多 car_model。这可能会或可能不会影响下面的挑战。

car_variants模型(自 1984 年以来几乎所有汽车的表)存储car_year_idcar_model_id。(car_make 通过 car_model 很明显)

现在……用户来了。他们想从 car_variants 表中选择他们的汽车,然后添加他们汽车的昵称license_plate。用户可能有很多汽车,因此 car_variant_id 不能存储在用户表中。相反,我们有一个包含用户汽车的汽车表。

  • car_variant 有很多汽车(将汽车想象成 car_variant 的一个实例)
  • 一个用户有很多车

Ryan Bates 做了一个关于动态选择菜单的精彩截屏视频。在他的示例(国家和州)中,他使用了 grouped_collection_select 和一些 javascript。对于这个挑战,这似乎也朝着正确的方向前进,但这更复杂,因为 has_many 关系比grouped_collection_select似乎能够处理的要多。

我已经成功地用 3 个下拉菜单对汽车表格进行了编码,包括年份、品牌和型号......

    <%= simple_form_for(@car) do |f| %>
      <%= f.error_notification %>
      <div class="form-inputs"> 

      <!-- select year to filter make dropdown -->
      <p>Year</p>
        <%= select_tag :car_year, options_for_select(CarYear.all.collect {|e| ["#{e.year}", e.id] }), :include_blank => true %>

      <!-- Select make to filter model dropdown -->
      <p>Make</p>
      <%= select_tag :car_make, options_for_select(CarMake.all.collect {|e| ["#{e.name}", e.id] }), :include_blank => true %>       

      <!-- Select model -->
      <p>Model (grouped collection select)</p>
      <%= f.grouped_collection_select :car_variant_id, CarMake.order(:name), :car_models, :name, :id, :name, include_blank: true %>        
      <%= f.input :nickname, :hint => "If you've given your car a nickname enter it here, otherwise just leave it blank." %>
        <%= f.input :plate %>
        <%= f.hidden_field :user_id, :value => current_user.id %>
      </div>

       <div class="form-actions">
        <%= f.button :submit, "Add Car" %>
      </div>
    <% end %>

...现在我如何将它们捆绑在一起,以便它们相互过滤,然后返回 car_variant_id 以存储在 car_form 中。

经过几个昏昏欲睡的深夜,我没有主意了。

4

0 回答 0