以多对多关系的嵌套形式存储顺序

时间:2013-11-27 15:58:00

标签: ruby-on-rails

我有一个Rails 4应用,模型ChallengeChallengeList。这是一个多对多的关系,所以我也有一个模型ChallengeListsChallenge的连接表。我定义了最后一个模型,因为我希望我的ChallengeLists成为有序列表,因此用它来利用acts_as_list

class ChallengeList < ActiveRecord::Base
  has_many :challenge_lists_challenges, :dependent => :destroy
  has_many :challenges, :through => :challenge_lists_challenges
  accepts_nested_attributes_for :challenges
end

class ChallengeListsChallenge < ActiveRecord::Base
  default_scope :order => 'position'
  belongs_to :challenge
  belongs_to :challenge_list
  acts_as_list :scope => :challenge_list
end

这很好用。


在我的HTML中,我有一个表单,允许用户定义新的ChallengeList。它有Challenges的嵌套表单:

= f.fields_for :challenges do |challenge_builder|
  .field
    = challenge_builder.text_field :description

但我也希望用户能够改变位置。所以我觉得我很聪明,为职位添加一个字段:

    = challenge_builder.text_field :position

当然,这不起作用,因为'position'是在连接项上设置的,而不是Challenge项。

拥有ChallengeListsChallenges的嵌套表单可以让我访问该位置,但不是很酷,因为:

  1. 我需要引用我的ChallengeList ID(这不是不可克服的,但也不是很漂亮)
  2. 我只能引用现有的Challenge ids
  3. 那我该怎么办?

1 个答案:

答案 0 :(得分:0)

喜欢this question

设置模型依赖关系,如下所示:

class ChallengeList < ActiveRecord::Base
  has_many :challenge_lists_challenges, :dependent => :destroy
  has_many :challenges, :through => :challenge_lists_challenges
  accepts_nested_attributes_for :challenge_lists
end

class ChallengeListsChallenge < ActiveRecord::Base
  default_scope :order => 'position'
  belongs_to :challenge
  belongs_to :challenge_list
  acts_as_list :scope => :challenge_list
  accepts_nested_attributes_for :challenges
end

这是一个双重嵌套的形式:

= form_for @challenge_list do |f|
  = f.fields_for :challenge_lists_challenges do |links_form|
    .field
      = links_form.number_field :position
      %br/
    = links_form.fields_for :challenge do |challenge_form|
      .field
        = challenge_form.text_field :description
    = challenge_form.text_field :id

它应该有用。