【问题标题】:Rails 4+ has_many :through associations with unique orderingRails 4+ has_many:通过具有唯一排序的关联
【发布时间】:2016-10-18 06:42:04
【问题描述】:

我有两个具有“has_many :through”关联的模型。它工作得很好,但我需要为每个组合添加唯一的排序。 假设我们有模型 Train and Carriages (Railway Carriage),每列火车都有独特的车厢组合

# /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 的最后一名。

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

在数据库中我看到carriage_ids从1保存到5(从最低到最高的id),那么可能有解决方案来逐个添加id吗?

我希望有一个简单的解决方案可以为每辆火车正确安排车厢。 谢谢

【问题讨论】:

  • 您可以有一个自定义职位表,然后加入并按此排序。也可以进行自定义订单,但是当您添加更多模型时会变得混乱。这是一个 gist 正是关于该主题

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


【解决方案1】:

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

【讨论】:

    【解决方案2】:

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

    【讨论】:

      猜你喜欢
      • 2015-11-27
      • 2015-11-16
      • 2014-12-16
      • 2013-11-24
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2016-03-20
      相关资源
      最近更新 更多