【问题标题】:ActiveRecord::HasManyThroughCantAssociateThroughHasOneOrManyReflection: Cannot modify association errorActiveRecord::HasManyThroughCantAssociateThroughHasOneOrManyReflection: 无法修改关联错误
【发布时间】:2017-03-27 14:47:37
【问题描述】:

这个关联有什么问题?

我的关联如下所示:

class Quote < ApplicationRecord
   has_many :language_pairs
end

class LanguagePair < ApplicationRecord
    belongs_to :quote
    belongs_to :w_flow
    has_many :w_flow_steps, through: :w_flow
end

class WFlow < ApplicationRecord
  has_many :language_pairs
  has_many :w_flow_steps
end

class WFlowStep < ApplicationRecord
 belongs_to :w_flow
end

当我跑步时

q=Quote.find(1)
q.language_pairs.create!(source_language:'French - EU', w_flow_id: 1)

我有以下错误:

ActiveRecord::HasManyThroughCantAssociateThroughHasOneOrManyReflection:无法修改关联“LanguagePair#w_flow_steps”,因为源反射类“WFlowStep”通过:has_many 关联到“WFlow”。

【问题讨论】:

  • 你想做什么?创建一个与Quote 关联的language_pairsid = 1?
  • 那个异常类名虽然..

标签: ruby-on-rails ruby activerecord has-many-through


【解决方案1】:

如果要创建与特定Quote 相关的LanguagePair,首先需要获取要关联的Quote

q = Quote.find(1)

然后将该变量传递给 LanguagePair 的 create 方法:

lp = LanguagePair.create!(quote: q, source_language:'French - EU', w_flow_id: 1)

Rails 会处理这些关系。

注意:您使用的是create!,如果记录无效会引发异常

【讨论】:

  • 是的,这是一种解决方案。实际上我想知道 q.language_pairs.create 的问题!(source_language:'French - EU', w_flow_id: 1)
  • 您想从实例q 创建language_pair
  • 是的,你能解释一下为什么我不能做 q.language_pairs.create!
  • 你不能调用language_pairs.create!,因为没有定义。查看这篇文章:api.rubyonrails.org/classes/ActiveRecord/NestedAttributes/…
  • 但是,您可以在Quote 中定义一个创建LanguagePair 的方法,这对您来说合理吗?
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2018-03-20
  • 1970-01-01
  • 2016-09-03
  • 2014-02-09
  • 2011-12-27
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多