【问题标题】:Use Polymorphic Associations with Default Scope使用具有默认范围的多态关联
【发布时间】:2016-07-22 00:40:06
【问题描述】:

我在 GitHub 上贡献了一个 ruby​​ on rails 应用程序,我遇到了以下情况:

我有以下要转换为多态的模型:

class Comment < ActiveRecord::Base
  belongs_to :team
  belongs_to :project
end

class Team < ActiveRecord::Base
  has_many :comments
end

class Project < ActiveRecord::Base
  has_many :comments, -> { order('created_at DESC') }, dependent: :destroy
end

我进行了以下更改以使其具有多态性:

执行数据库更改以删除 team_id、project_id 并将 commentable_id 和 commentable_type 添加到 cmets 表。

导轨中描述的模型修改:

class Comment < ActiveRecord::Base
  belongs_to :commentable, polymorphic: true
end

class Team < ActiveRecord::Base
  has_many :comments, as: :commentable
end

class Project < ActiveRecord::Base
  has_many :comments, as: :commentable, -> { order('created_at DESC') }, dependent: :destroy
end

虽然我将它与默认范围一起使用,但它不允许我与默认范围一起使用并在项目模型的以下行中给出错误:

has_many :comments, as: :commentable, -> { order('created_at DESC') }, dependent: :destroy

我的浏览器出现以下错误:

任何帮助将不胜感激。提前致谢!

【问题讨论】:

  • 嘿,我也遇到过类似的事情,我在 Rails github 上打开了一个问题......让我们看看我们是否可以得到任何意见。 github.com/rails/rails/issues/25288

标签: ruby-on-rails ruby-on-rails-4 scope associations polymorphic-associations


【解决方案1】:

好的,应该这样做,范围是第二个参数,选项哈希在之后

has_many :comments, -> { order('created_at DESC') } ,{as: :commentable, dependent: :destroy}

查看文档 https://github.com/rails/rails/blob/master/activerecord/lib/active_record/associations.rb#L1359

“您可以将 second 参数 +scope+ 作为可调用对象传递”

我犯了和你一模一样的错误,是不是很困惑?

【讨论】:

    【解决方案2】:

    只需在 lambda 函数之前加上“dependent::destroy”即可。

    这是一个非常无聊的 ruby​​ 语法。除非您声明多个哈希,否则您无需在参数中添加括号{} 来声明哈希。

    如果您编写,您当前的代码将有效

      has_many :comments, { as: :commentable }, -> { ... }, { dependent: :destroy }
    

    由于两个键/值对不在同一个哈希中,ruby 无法解释该行。

    相反,在as: :commentable 之后移动dependent: :destroy 将告诉ruby 处理同一哈希中的两个键/值对。

     has_many :comments, as: :commentable, dependent: :destroy, -> { order('created_at DESC') }
    

    快乐编码,

    亚辛。

    【讨论】:

    • 嗨@Yacine,感谢您的回答。我很感激。修改代码后,我得到同样的错误。我更新了问题。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2020-01-16
    • 2011-05-23
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多