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有:
- 第一名 train_1,
- 第二名train_2,
- 最后一位 train_3。
这意味着我不能使用这样的解决方案,因为我没有命令车厢的参数。
在数据库中,我看到 carriage_ids 从 1 保存到 5(从最低到最高 ID),所以可能有一个一个地添加 ID 的解决方案吗?
我希望有一个简单的解决方案来为每列火车正确排序车厢。
谢谢
您可以将 position
属性添加到您的 Combination
模型,表示 Carriage
在 Train
中的位置。
我尝试使用 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。
我有两个模型与“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_2,
- 最后一位 train_3。
这意味着我不能使用这样的解决方案,因为我没有命令车厢的参数。
在数据库中,我看到 carriage_ids 从 1 保存到 5(从最低到最高 ID),所以可能有一个一个地添加 ID 的解决方案吗?
我希望有一个简单的解决方案来为每列火车正确排序车厢。 谢谢
您可以将 position
属性添加到您的 Combination
模型,表示 Carriage
在 Train
中的位置。
我尝试使用 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。