【问题标题】:Rails 4 has_many through - Cannot modify associationRails 4 has_many through - 无法修改关联
【发布时间】:2015-07-14 12:14:42
【问题描述】:

我有 DayItem 模型,它有一个 SchoolProgram,其中有许多研讨会。

class DayItem < ActiveRecord::Base
  has_one :school_program, dependent: :destroy
  has_many :seminars, through: :school_program

  accepts_nested_attributes_for :school_program
  accepts_nested_attributes_for :seminars, reject_if: :all_blank
end

class SchoolProgram < ActiveRecord::Base
  belongs_to :day_item
  has_many :seminars, dependent: :destroy

  accepts_nested_attributes_for :seminars, allow_destroy: true, reject_if: :all_blank
end

class Seminar < ActiveRecord::Base
  belongs_to :school_program
end

我正在使用 cocoon gem 进行动态嵌套表单,如下所示。

_form.html.haml:

= simple_form_for [@day, @day_item] do |f|
  = f.input :start_time
  = f.simple_fields_for :school_program do |form|
    = form.input :school
    = form.simple_fields_for :seminars do |seminar|
      = render 'seminar_fields', :f => seminar, :parent => form
    .links
      = link_to_add_association 'add seminar', form, :seminars

_seminar_fields.html.haml:

.nested-fields.well.well-compact
  .form-inline
    = f.input :name
    = link_to_remove_association "remove seminar", f

但是当我尝试添加一个研讨会时,我得到了以下异常。

 ActiveRecord::HasManyThroughCantAssociateThroughHasOneOrManyReflection 在 Etm::DayItemsController#update

无法修改关联“DayItem#seminars”,因为源反射类“Seminar”通过 :has_many 关联到“SchoolProgram”。

感谢任何帮助。

【问题讨论】:

    标签: ruby-on-rails nested nested-forms cocoon-gem


    【解决方案1】:

    关系中的循环引用(源反射)

    这里可能存在不止一个问题,但第一个应该解决的问题是您与研讨会的关系创建了循环引用。它在 DayItem 中的 has_many 中声明,然后在 SchoolProgram 中声明为 has_one,它本身属于父类 DayItem。请尝试对我们的 DayItem 模型进行以下更改。让其他模型保持原样,让我知道情况如何。

    class DayItem < ActiveRecord::Base
      has_one :school_program, dependent: :destroy
    
      accepts_nested_attributes_for :school_program
    end
    

    【讨论】:

    • 我不这么认为。如果我删除研讨会关联,则会收到错误消息,因此我必须删除 accepts_nested_attributes_for :school_program,并且不会显示任何研讨会
    • 糟糕。是的。当然删除嵌套的属性。我编辑了答案。就像我提到的,可能存在不止一个问题。该模型具有循环关系。必须先解决这个问题。然后您可以正确设置其他关系。我可以提供帮助,但需要查看更多代码。 “未显示任何研讨会”需要更多详细信息。
    • 我编辑了我的主要问题并添加了更多代码。 “没有显示研讨会”我的意思是它给了我一个错误 Association seminars doesn't exist on DayItem 在线 = link_to_add_association 'add seminar', f, :seminars
    • 是的。表单代码需要工作。我现在看看那个。我使用 Simple Form,但不是 Cocoon 或 HAML,但我会看看我能想出什么。
    • 目前尚不清楚 Cocoon 是否允许多级关联嵌套。 “嵌套表单是在一个表单中处理嵌套模型和属性的表单;例如,带有任务的项目或带有行项目的发票。”可能没问题,但如果我使用这个 gem,我会在 repo github.com/nathanvda/cocoon 上向开发人员发布一个问题,并确保 gem 可以用于多个嵌套级别。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多