2017-01-30 3 views
0

У меня две модели: BigCategory и SmallCategory.Как использовать friendly_id в случае с Rails?

class BigCategory < ApplicationRecord 
    extend FriendlyId 
    friendly_id :name, use: :slugged 

    has_many :small_categories, dependent: :destroy 
end 

class SmallCategory < ApplicationRecord 
    extend FriendlyId 
    friendly_id :name, use: :slugged 

    belongs_to :big_category 
end 

Я хочу, чтобы все small_categories where big_category_id == params[:big_category_id].

SmallCategory.where(big_category_id: params[:big_category_id]) 

Использование friendly_id является friendly.find:

SmallCategory.friendly.find(params[:id]) 

Здесь params[:id] является идентификатор записи. Итак, вышеприведенный случай. Есть ли способ получить все small_categories с красивым URL-адресом?

ответ

1

Лучший способ сделать это все вместе будет использовать один self-joining model построить иерархию:

class Category < ApplicationRecord 
    belongs_to :parent, class_name: "Category" 
    has_many :sub_categories, foreign_key: "parent_id", class_name: "Category" 
end 

Если после этого вы хотите сделать два уровня найти вы можете сделать:

@parent = Category.includes(:sub_categories) 
        .find(params[:category_id]) 
@category = @parent.sub_categories 
        .friendly.find(params[:id]) 
+0

Использование самосоединения позволит вам создать иерархию любой глубины, а также запрос для категорий в одной таблице независимо от их «глубины». – max

+0

Спасибо. Это выглядит неплохо. Я попробую это позже. –

Смежные вопросы