Я не знаю, с какой версией 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, в противном случае это вызовет головную боль и / или перерыв.