使用具有默认范围的多态关联

时间:2016-04-02 04:52:32

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

我在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添加到注释表。

导轨指南中描述的模型修改:

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

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

enter image description here

任何帮助将不胜感激。在此先感谢!

2 个答案:

答案 0 :(得分:3)

好的,这就是应该怎么做,范围是第二个参数,选项哈希是在

之后
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

&#34;您可以传递第二个参数+范围+作为可调用的&#34;

我犯了与你完全相同的错误,令人困惑的不是吗?

答案 1 :(得分:0)

在lambda函数之前放置“dependent :: destroy”。

这是ruby中非常无聊的语法内容。除非声明多个哈希值,否则不需要使用括号{}来声明参数中的哈希值。

如果您编写

,您当前的代码将有效
  has_many :comments, { as: :commentable }, -> { ... }, { dependent: :destroy }

因为两个键/值对都不在同一个哈希中,所以ruby无法解释该行。

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

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

快乐编码,

亚辛。