Вложенный набор драгоценностей - нужен ли он мне и как ограничить глубину, если так - PullRequest
0 голосов
/ 24 февраля 2012

Я пытаюсь создать свое приложение, используя вложенный набор Gem здесь Я пытаюсь создать простое меню продукта для своего приложения, поэтому у меня будет что-то вроде

+ Категория--Category----Товар----Товар--Category----Товар----Товар

Моя проблема с вложенным самоцветом Set в том, что я не хочу, чтобы глубина два превышала глубину двух категорий.Вложенный набор gem по умолчанию допускает что-то вроде этого

+ Категория--Category--- Категория---- Категория-----Товар

Но для наших стилей CSS мы не хотим иметь дело с такой большой глубиной, и клиенту не нужна такая большая глубина.

Так что мне интересно,Во-первых, мне даже нужен вложенный набор, или в этом сценарии будет работать стандарт has_many Proper_?Я использую Nested Set из ответов на этот вопрос здесь .

Я лично считаю, что я могу просто использовать стандартный has_many и принадлежит, если кто-то не может сообщить мне преимуществоиспользовать Nested Set в моем случае.Если мне это нужно, как я могу ограничить выбор пользователем только правильной глубины для добавления узла?

РЕДАКТИРОВАТЬ: Решено, Спасибо.Моя новая проблема: я получаю сообщение об ошибке

неопределенный метод `self_and_descendants 'для []: ActiveRecord :: Relation Извлеченный источник (вокруг строки № 9):

6: </p>
7: <p>
8:   <%= f.label(:parent_id) %>
9:   <%= f.select :parent_id, nested_set_options(Category.categories, @category) {|i,     level| "#{'-' * level} #{i.name}" } %>
10: </p>
11: <p>
12:   <% # f.label(:position) %>

просмотров / категорий / _form.html.erb

<%= form_for(@category) do |f| %>
<p>
  <%= f.label(:name) %>
  <%= f.text_field :name %>
</p>
<p>
  <%= f.label(:parent_id) %>
    <%= f.select :parent_id, nested_set_options(Category.categories, @category) {|i, level| "#{'-' * level} #{i.name}" } %>
</p>
<p>
  <% # f.label(:position) %>
  <% # f.select :position, 1..category_count %>
</p>
<p>
  <%= f.submit("Submit") %>
</p>
<% end %>

моделей / категорий.rb

class Category < ActiveRecord::Base
  acts_as_nested_set
  acts_as_list :scope => :parent_id
  has_many :products
  scope :position, order("position asc")
  scope :categories, where("parent_id IS NULL")
  scope :subcategories, where("parent_id IS NOT NULL")
end

маршруты.rb (укорочено для космоса)

Locksmithing::Application.routes.draw do
resources :categories do
  collection { post :sort }
  resources :children, :controller => :categories, :only => [:index, :new, :create, :new_subcategory]
  end
end

1 Ответ

1 голос
/ 26 февраля 2012

Вы можете определенно продолжать использовать nested_set в этом контексте.

У меня есть иерархическая настройка в приложении, над которым я сейчас работаю, и хотя я разрешаю бесконечное вложение, я хочу, чтобы навигация отображала только 2 верхних уровня.

У меня есть именованная область, чтобы я мог ограничить то, на что я смотрю:

scope :with_depth_below, lambda { |level|
  where(self.arel_table[:depth].lt(level))
}

Так, чтобы (используя Category из вашего примера) вы могли использовать

Category.with_depth_below(4).arrange

Вы можете передать эту область в любую из областей nested_set - или, действительно, View Helper, который вы, вероятно, намереваетесь использовать для ограничения количества уровней, которые она может пройти.

Чтобы по-настоящему ограничить его, я бы просто поместил ограничение проверки ... before_save, проверив, что глубина меньше вашей максимальной глубины. Имеет смысл?

...