форма рельсов: не показывать ребенка в форме, если он уже есть - PullRequest
0 голосов
/ 19 ноября 2018

Person.rb:

class Person < ApplicationRecord
  has_many :skills
end

Skill.rb:

   class Skill < ApplicationRecord
      belongs_to :person
      validates_uniqueness_of :name, :scope => :person_id
    end

Я сделал навыки, вложенные в Routes.rb:

  resources :people do 
    resources :skills
    end
  end

Теперь, когда я создаю новый навык для клиента в clients/1/skills/new, я не хочу выбирать навык, который уже есть у клиента. Как это можно сделать? Вот мое текущее поле ввода:

= f.select :skill_id, Skill.all.map{|c| [c.name, c.id]}, {include_blank: true}

Ответы [ 2 ]

0 голосов
/ 19 ноября 2018

в person.rb

def available_skills 
   skills = self.skills.pluck(:name, :id)
   Skill.pluck(:name, :id).select{|s| !skills.include?(s)}
end 

в представлении шаблона:

<%= f.select :skill_id, @person.available_skills, {include_blank: true} %>
0 голосов
/ 19 ноября 2018

Я не знаю, с какой версией Rails вы работаете, но вы можете создать область видимости для класса Skill.

 scope :remaining, ->(name) { where.not(name: name) }

Затем обновите ваше представление:

 = f.select :skill_id, Skill.remaining(@person.skills.map(&:name)).map { |c| [c.name, c.id] }, { include_blank: true }

Это не проверено, не уверен, что вам нужно .map :name, но вы поняли идею.Также измените :name на :id, если это лучше подходит для вашего случая использования (я не уверен, что вы применяете уникальность навыка по всем направлениям или только для каждого пользователя).

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

def self.remaining # you're mapping the skill, not the client
  where.not(id: person.skill_ids).map { |s| [s.name, s.id] }
end

Тогда представление будет просто:

= f.select :skill_id, Skill.remaining, { include_blank: true }

КакКроме того, я предполагаю, что /clients против /people - это одно и то же с разными именами только на SO, в противном случае это вызовет головную боль и / или перерыв.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...