Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/ruby/20.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Ruby on rails rails api:从第二个联接表关联元数据_Ruby On Rails_Ruby_Ruby On Rails 4_Active Model Serializers_Rails Api - Fatal编程技术网

Ruby on rails rails api:从第二个联接表关联元数据

Ruby on rails rails api:从第二个联接表关联元数据,ruby-on-rails,ruby,ruby-on-rails-4,active-model-serializers,rails-api,Ruby On Rails,Ruby,Ruby On Rails 4,Active Model Serializers,Rails Api,在高层,我有Recipe、Skill和User,以及RecipeSkill和UserSkill的联接表 当返回给定配方的技能时,我想知道用户已经学会了该配方的哪些技能。您可以在下面看到一些JSON示例 我甚至不确定用什么样的方式来表达这个问题,因为我对如何解决这个问题感到茫然。我相信我可以一起破解一些东西,但这似乎是一个相当常见的情况,其中必须有一些预先存在的约定 这是我的型号和我的配方系列化器: class Recipe < ActiveRecord::Base has_many :

在高层,我有
Recipe
Skill
User
,以及
RecipeSkill
UserSkill
的联接表

当返回给定配方的技能时,我想知道用户已经学会了该配方的哪些技能。您可以在下面看到一些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
序列化程序上,也许可以添加一个方法来判断用户是否具备该技能。假设if
user.skills
包含他们学到的技能:

class SkillSerializer < ActiveModel::Serializer

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

  def earned
    scope.skills.include? object  
  end
end
class SkillSerializer
范围是您所代表的用户。看


我认为这里可能存在一些性能问题,但希望它能将您带向正确的方向

我主要关心的是性能问题。我希望有一个更好的方法。也许有一个专门针对用户的方法。Enowned_skill?(skill)可以做一些轻量级的记忆/缓存。我相信你只需要一个DB查询就可以实现这个功能。这就是我最后要做的。我还将所有内容提取到一个
UserSkillsCache
对象中,并在其中进行了记忆。谢谢
class SkillSerializer < ActiveModel::Serializer

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

  def earned
    scope.skills.include? object  
  end
end