Пользовательский метод проверки Rails - PullRequest
1 голос
/ 10 апреля 2020

Я использую драгоценный камень для создания подкатегорий. После этого, когда я создаю элемент (модель элемента), я использую следующую группу выбора, чтобы связать элемент с подкатегориями, которым он принадлежит. Выбор группы включает категории и подкатегории, сгруппированные вместе.

<%= form.input :category, collection: @categories, as: :grouped_select, group_method: :children, label: false, include_blank: true %>

@categories = Category.where(ancestry: nil).order('name ASC')

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

Теперь я хотел бы добавить собственный метод validate внутри модели, который позволит пользователю добавлять только подкатегории, принадлежащие к той же основной категории, или иначе возвращать ошибку:

errors.add(:category, "you can only choose subcategories from he same category")   

Я застрял на том, как создать этот validate метод. Может быть, сначала я должен найти подкатегории, которые добавляются:

subcategory = Category.find(category)

И затем найти категорию, к которой относится подкатегория:

subcategory.root.name

Но после этого у меня есть идея что делать.

Как я могу создать этот метод validate, чтобы позволить пользователю добавлять только подкатегории, принадлежащие к той же основной категории, или иначе возвращать ошибку?

Заранее спасибо. Помощь будет очень цениться в этом.

1 Ответ

1 голос
/ 12 апреля 2020

Если я понимаю, все категории, присвоенные элементу, должны быть подкатегориями одной и той же категории. И я предполагаю, что они должны быть подкатегориями.

Напишите пользовательский метод проверки в Item, который проверяет, что у всех подкатегорий есть родители, и все подкатегории одинаковы.

class Item < ApplicationRecord
  has_many categories

  validate :categories_have_the_same_parent

  private def categories_have_the_same_parent
    if categories.any? { |cat| !cat.ancestry_id }
      errors.add(
        :categories,
        :not_a_subcategory,
        "All categories must be sub-categories"
      )
    end

    if categories.each_cons(2).any? { |a,b| a.ancestry_id != b.ancestry_id }
      errors.add(
        :categories,
        :different_ancestors,
        "All categories must have the same parent."
      }
    end
  end
end

Диагностика может быть улучшена для включения категорий-нарушителей.

Затем в форме заполните Элемент информацией формы и проверьте правильность проверки Элемента как обычно.

class ItemController < ApplicationController
  def create
    @item = Item.create!(...params...)

    ...creation succeeded...
  rescue ActiveRecord::RecordInvalid => e
    ...creation failed...
  end
end
...