召唤所有 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_id和car_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 中。
经过几个昏昏欲睡的深夜,我没有主意了。