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

时间:2016-06-16 16:15:13

标签: ruby-on-rails ruby-on-rails-4 associations

我有两个模型,其中包含“ 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 包含:

  • 第一名在train_1,
  • 第二名,第二名,
  • train_3的最后一个地方。

这意味着我不能使用像https://stackoverflow.com/a/19138677/4801165这样的解决方案,因为我没有订购车厢的参数。

在数据库中,我看到carriage_ids从1节省到5(从最低到最高id),所以可能有解决方案逐个添加id?

我希望有一个简单的解决方案来为每辆列车获得正确的运输顺序。 谢谢

2 个答案:

答案 0 :(得分:0)

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

答案 1 :(得分:0)

我尝试使用Fred Willmore建议,但如果您使用嵌套表单手动添加每个元素,则不需要此附加列。 您可以在https://rubygems.org/gems/cocoon找到Gem,并使用标准Rails表单 https://github.com/nathanvda/cocoon/wiki/ERB-examples这个漂亮的指南。