【问题标题】:Can't add or delete from a Has many through association model in rails 3.2无法从 Rails 3.2 中的 Has many through 关联模型中添加或删除
【发布时间】:2016-09-17 10:58:13
【问题描述】:

我有这 3 个模型:

class BikeActionGroup < ActiveRecord::Base
  has_many :bike_action_groups_slas
  has_many :slas,through: :bike_action_groups_slas
end

class BikeActionGroupsSla <  ActiveRecord::Base   
  belongs_to :bike_action_group
  belongs_to :sla
end

class Sla < ActiveRecord::Base
  has_many :bike_action_groups_slas
  has_many :bike_action_groups, through: :bike_action_groups_slas
end

每当我尝试向sla.bike_action_groups 添加或删除某些内容时,它都会在删除或追加时给我一个 NoMethodError。我调试了sla.bike_action_groups 来查看它的内容,它没有返回一个bike_action_groups 数组,而是返回这个:

[#&lt;BikeActionGroup id: 2, name: "Wheels"&gt;]

我不能对此调用任何方法,如删除,但如果我用to_a 将其转换为数组,我可以,只有这不会从实际的sla.bike_action_groups 中删除它,而是从转换后的数组中删除它

这是我用来添加或删除的方法:

@sla.bike_action_groups << @bike_action_group    
@sla.bike_action_groups.delete(@bike_action_group)

【问题讨论】:

  • 你能发布你正在使用的方法调用吗?这是 has_many through 的预期行为,但我想在发布我的答案之前看看您是如何尝试使用它的。
  • 您在sla.bike_action_groups 上尝试过&lt;&lt; 吗?可能如果 rails 3 不能添加适当的中间记录,你必须使用非直通关系...

标签: ruby-on-rails ruby ruby-on-rails-3.2 associations has-many-through


【解决方案1】:

使用clear

collection.clear - 从集合中删除所有对象。 这不会破坏对象。 看到这个link

【讨论】:

    【解决方案2】:

    它只是一个ActiveRecord对象的集合,不是一个实例,所以你不能在上面调用#delete或者其他实例方法。

    但可以肯定的是,您应该能够在此集合上构建新对象,如下所示: sla.bike_action_groups.buildsla.bike_action_groups.new

    要销毁此集合中的任何实例,只需先获取一个: sla.bike_action_groups.first.destroy

    【讨论】:

    • 它不会破坏模型本身而不是从集合中删除它吗?
    • sla.bike_action_groups.first.destroy 它将破坏特定模型,而不是取消链接。
    • 我要做的只是取消链接而不是删除bike_action_group 本身
    • @Kupi 抱歉没有提到您只想取消链接。
    【解决方案3】:

    您需要在has_many 关联中使用:dependent =&gt; :destroy

    class BikeActionGroup < ActiveRecord::Base
         has_many :bike_action_groups_slas, :dependent => :destroy
         has_many :slas,through: :bike_action_groups_slas
    end
    class BikeActionGroupsSla <  ActiveRecord::Base   
       belongs_to :bike_action_group
       belongs_to :sla
    end
    
    class Sla < ActiveRecord::Base
       has_many :bike_action_groups_slas, :dependent => :destroy
       has_many :bike_action_groups, through: :bike_action_groups_slas
    end
    

    欲了解更多信息,请通过此Link

    【讨论】:

    • 嗯,这并没有真正改变什么
    猜你喜欢
    • 2015-02-17
    • 1970-01-01
    • 2017-07-31
    • 1970-01-01
    • 1970-01-01
    • 2014-04-15
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多