Rails 4+ has_many :通过具有唯一排序的关联

Rails 4+ has_many :through associations with unique ordering

我有两个模型与“has_many :through”关联。它运行良好,但我需要为每个组合添加唯一的顺序。 假设我们有模型火车和车厢(铁路车厢),每列火车都有独特的车厢组合

# /models/train.rb
class Train < ActiveRecord::Base
  has_many :carriages, through: :combinations
end

# /models/carriage.rb
class Carriage < ActiveRecord::Base
  has_many :trains, through: :combinations
end

# /models/combination.rb
class Combination < ActiveRecord::Base
  belongs_to :train
  belongs_to :carriage
end

# /controllers/trains_controller.rb
class TrainsController < ApplicationController
  def shortcut_params
    params.require(:train).permit(:name, :description, carriage_ids: [])
  end
end

# /views/trains/_form.html.erb
<div class="field">
  <%= f.label :carriage_ids, 'Choose Carriages' %><br>
  <%= f.select :carriage_ids, Carriage.all.collect { |x| [x.name, x.id] }, {}, multiple: true, size: 6 %>
</div>

例如:

train_1 = carriage_5, carriage_4, carriage_1, carriage_3, carriage_2, carriage_6
train_2 = carriage_6, carriage_5, carriage_3, carriage_1, carriage_2, carriage_4
train_3 = carriage_1, carriage_2, carriage_3, carriage_4, carriage_6, carriage_5

在这个例子中carriage_5有:

这意味着我不能使用这样的解决方案,因为我没有命令车厢的参数。

在数据库中,我看到 carriage_ids 从 1 保存到 5(从最低到最高 ID),所以可能有一个一个地添加 ID 的解决方案吗?

我希望有一个简单的解决方案来为每列火车正确排序车厢。 谢谢

您可以将 position 属性添加到您的 Combination 模型,表示 CarriageTrain 中的位置。

我尝试使用 Fred Willmore 的建议,但如果您使用嵌套表单手动添加每个元素,则不需要此附加列。 您可以在此处找到 Gem https://rubygems.org/gems/cocoon and use this nice guide with Standard Rails Forms https://github.com/nathanvda/cocoon/wiki/ERB-examples