Skip to content

Custom class name for relation that's not using Rails convention #95

@vtno

Description

@vtno

I have this Course model which has has_many: quality_badges relation but the actual class is named CharacterQualityBadge

class Course < ApplicationRecord
  ...
  has_many :course_quality_badges
  has_many :quality_badges, class_name: 'CharacterQualityBadge',
                            foreign_key: :character_quality_badge_id,
                            through: :course_quality_badges,
                            dependent: :destroy
  ...
end

In the controller I cannot do

# courses_controller.rb
render jsonapi: @course,
               include: [
                :course_locales, :course_schedules, :competency,
                :quality_badges, :competency_badges
               ]

# serializable_course.rb
attributes :name, ....
...
has_many :quality_badges

It'll throw undefined method new' for nil:NilClass because there is no QualityBadge model class.

I need to add an alias method in the Model and use it in the serializable class in order to make it work. ( so: quality_badge -> character_quality_badge)

# course.rb
class Course < ApplicationRecord
  ...
  has_many :course_quality_badges
  has_many :quality_badges, class_name: 'CharacterQualityBadge',
                            foreign_key: :character_quality_badge_id,
                            through: :course_quality_badges,
                            dependent: :destroy

  # This does not look so good to me.
  def character_quality_badges
    quality_badges 
  end
  ...
end

# course_controller.rb
render jsonapi: @course,
               include: [
                :course_locales, :course_schedules, :competency,
                :character_quality_badges, :competency_badges
               ]

# serializable_course.rb
attributes :name, ....
...
has_many :character_quality_badges

It'd be great if I can specify the mapping of the class name inside linkage method or any other proper place like what you guys did for mapping resource with it serializer class.

render jsonapi: post, class: { Post: SerializableCustomPost }

Metadata

Metadata

Assignees

No one assigned

    Labels

    No labels
    No labels

    Type

    No type

    Projects

    No projects

    Milestone

    No milestone

    Relationships

    None yet

    Development

    No branches or pull requests

    Issue actions