【问题标题】:default_scope breaks dependent destroy behaviourdefault_scope 打破依赖破坏行为
【发布时间】:2014-07-30 10:12:53
【问题描述】:

我的微型模型具有以下关联:

class Miniature < ActiveRecord::Base
  has_many :minilines, dependent: :destroy
  has_many :lines, :through => :mini lines

这很好用,但我想让 Minilines 按名称的字母顺序排序,所以我添加了这个:

class Miniline < ActiveRecord::Base
    default_scope { order('name ASC') }
    belongs_to :miniature
    belongs_to :line

我认为这可以正常工作,但是当您删除 Miniature 时会出现错误:

ActiveRecord::StatementInvalid (SQLite3::SQLException: 没有这样的列: 名称:SELECT "minilines".* FROM "minilines" WHERE “minilines”。“miniature_id”=?按名称 ASC 订购):
app/controllers/miniatures_controller.rb:205:in `destroy'

删除 default_scope 行允许您删除 Miniature 并具有正确的行为。

我不清楚为什么 default_scope 会破坏这种行为或如何纠正它。

我的问题似乎与this 重复,但那里勾选的解决方案并没有为我解决。

【问题讨论】:

  • 有点。不同之处在于我没有尝试 delete_all 或 update_all ,因此 Q 上的答案似乎不适用于我的。我在那里看不到可以解决我的问题的答案。
  • 很奇怪。你确定有minilines.name 列吗? Miniline.all 在控制台返回什么?
  • 啊哈!不,没有迷你 legions.name 列,它是关联 Line 模型中的 name 列。排序适用于关联,但我想它会以某种方式绊倒破坏。

标签: ruby-on-rails


【解决方案1】:

你应该有:

default_scope { joins(:line).order('lines.name ASC') }

【讨论】:

  • 是的!因此,虽然我稍短的 default_scope 代码用于排序,但它在删除时混淆了 ActiveRecord。很公平。这是一个很好的解决方案,我不知道您可以通过加入模型订单来如此精确。太好了。
猜你喜欢
  • 2013-08-05
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2019-12-29
  • 1970-01-01
  • 2020-01-29
  • 1970-01-01
  • 2018-02-21
相关资源
最近更新 更多