2014-10-30 3 views
0

У меня есть рецепт, где каждый рецепт связан с рядом ингредиентов, а ингредиенты организованы с использованием драгоценного камня ancestry.Rails ancestry association

class Ingredient < AR::Base 
    has_ancestry 
    has_many :recipe_ingredients 
    has_many :recipes, through: :recipe_ingredients 
end 

class Recipe < AR::Base 
    has_many :recipe_ingredients 
    has_many :ingredients, through: :recipe_ingredients 
end 

Так, например, «соевый соус» будет ингредиент и «Kikkoman» будет ребенок «соевый соус». Рецепт может требовать «соевый соус» или специально вызывать «киккоман» по имени.

Я хочу, чтобы иметь возможность искать рецепты по родословной, поэтому, если бы я запустил поиск «соевого соуса», он также нашел бы рецепты с ребенком «киккоман». Как я могу это сделать с помощью Rails magic?

ответ

1

если ingredient_key является данный ингредиент (соевый соус), это может дать вам все рецепты:

(ingredient_key.ancestors + ingredient_key + ingredient_key.descendants).map(&:recipes).flatten.uniq.

Вы можете опустить предков, если хотите только рецепты этого ингредиента и его детей.

+0

Поскольку я не нуждался в предках, я просто использовал компонент.subtree, который включает как ингредиент, так и его потомков. –