简体   繁体   中英

Ruby on Rails: Polymorphic Association Confusion

I am contributing one of the ruby on rails application over GitHub where I faced the following scenario:

I am having following models which I want to convert to make polymorphic:

class Comment < ActiveRecord::Base
  belongs_to :team
  belongs_to :user
  belongs_to :application
  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

class User < ActiveRecord::Base
end

class Application < Rails::Application
end

I made following changes to make it polymorphic:

Perform database change to removed team_id , project_id , application_id and user_id and added commentable_id and commentable_type to comments table.

Modifications in models as described within rails guides.:

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

While I use it with default scope, It doesn't allow me to use with default scope and gives error with below line:

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

I am confused to change in following models:

class User < ActiveRecord::Base
end

class Application < ActiveRecord::Base
end

Should I need following changes in User and Application model?

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

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

Thanks in Advance!

if your user/application object needs comments then add

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

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

else create belongs_to/has_many relationship not polymorphic Eg.

class User < ActiveRecord::Base
  has_many :comments
end

class Application < ActiveRecord::Base
  has_many :comments
end

The technical post webpages of this site follow the CC BY-SA 4.0 protocol. If you need to reprint, please indicate the site URL or the original address.Any question please contact:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM