我在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
我的浏览器出现以下错误:
任何帮助将不胜感激。在此先感谢!
答案 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') }
快乐编码,
亚辛。