1

I 가지고, RecipeSkillUserSkill의 표를 결합하여 높은 수준 Recipe, SkillUser에서.레일-API : 메타 데이터를 연관 번째 행은 테이블 조인

주어진 레시피에 대해 스킬을 반환 할 때, 사용자가 이미 배운 레서피에 대해 어떤 스킬을 알고 싶습니다. 아래에서 JSON 예제를 볼 수 있습니다.

저는이 문제를 해결하는 방법에 대해 잃어버린 느낌이 들기 때문에이 질문을 표현하는 가장 좋은 방법은 확실하지 않습니다. 나는 함께 뭔가를 해킹 할 수있을 것이라고 확신하지만, 기존의 관례가 있어야하는 경우가 꽤 흔한 것 같다. 몇 가지 예를 JSON

class Recipe < ActiveRecord::Base 
    has_many :recipe_skills 
    has_many :skills, through: :recipe_skills 
end 

class Skill < ActiveRecord::Base 
    has_many :recipe_skills 
    has_many :recipes, through: :recipe_skills 
end 

class RecipeSkill < ActiveRecord::Base 
    belongs_to :recipe 
    belongs_to :skill 
end 

class User < ActiveRecord::Base 
    has_many :user_skills 
    has_many :skills, through: :user_skills 
end 

class UserSkill < ActiveRecord::Base 
    belongs_to :user 
    belongs_to :skill 
    # attributes :id, :user_id, :skill_id, :strength, :capacity, :learned 
end 

class RecipeSerializer < ActiveModel::Serializer 
    embed :ids, include: true 

    has_many :skills 

    attributes :id, :title 
end 

그리고 다음과 같습니다 :

Skill 시리얼에
{ 
    "skills": [ 
    { 
     "id": 1, 
     "name": "Grilling Chicken", 
     "earned": true 
    } 
    ] 
    "recipe": { 
    "id": 1, 
    "title": "Roasted Potatoes", 
    "skill_ids": [ 
     1 
    ] 
    } 
} 

답변

1

, 아마, 사용자가 해당 기술이 있는지 여부를 수치 방법을 추가 여기

내 모델과 내 RecipeSerializer 있습니다 아닙니다. user.skills이 기술을 포함하는 경우가 배운 것을 가정 :

class SkillSerializer < ActiveModel::Serializer 

    attributes :earned, # :id, :name, etc 

    def earned 
    scope.skills.include? object 
    end 
end 

범위는 당신이 표현하고있는 사용자입니다. docs here을 참조하십시오.

여기에는 성능 문제가있을 수 있지만 잘하면 올바른 방향으로 넣을 수 있습니다.

+0

내 관심사는 실제로 성능 문제입니다. 더 좋은 방법이있을 수 있기를 바랬습니다. –

+1

아마도 user.earned_skill? (스킬)과 같은 사용자 전용 메서드는 간단한 메모/캐싱을 수행 할 수 있습니다. 단 하나의 DB 쿼리로 작업 할 수 있다고 확신합니다. –

+0

그게 내가 끝내 준거야. 'UserSkillsCache' 객체로 모든 것을 추출하고 거기서 메모했습니다. 감사! –

관련 문제