Доступ к другим значениям моделей в представлении, простой, но сложный? - PullRequest
1 голос
/ 21 января 2011

У меня есть простая проблема, но найти решение НЕ так просто.

У меня есть две модели, Персона, Умение
Человек имеет много навыков
Навыки принадлежат человеку

В базе данных таблица Person имеет идентификатор skill_id, который берет идентификатор из таблицы навыков в качестве внешнего ключа.

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

Person.html (просмотр)

<p>Current skills for: <b><%= "#{ @person.name }" -%></b></p>   

<% @people.each do |p| %>  
    <p>Age: <%= "#{p.age}" %></p>  
    <p><%= "#{p.start_date}" %></p>  
    <p><%= "#{p.skill_id}" %></p>    
<% end %> 

Ответы [ 3 ]

2 голосов
/ 21 января 2011

Вы говорите, у вас есть has_many :skills.но затем вы продолжаете говорить, что у вас есть skill_id на столе persons, что несовместимо.Что вы хотите?

Хотите ли вы, чтобы у человека был какой-то конкретный навык, и в этом случае то, что у вас сейчас есть, хорошо для базы данных, а для модели - нет.Модель Person в этом случае должна иметь belongs_to :skill, а модель Skill должна иметь has_many :people

Другой возможный путь вокруг, я могу думать, что вы хотели бы, чтобычеловек has_and_belongs_to_many :skills и навык has_and_belongs_to_many :people.Это позволит многим людям овладеть многими навыками, и я действительно думаю, что вы этого хотите.Затем в представлении вы можете сделать это:

<% people.each do |p| %>
  <h2><%= p.name %>'s skills</h2>
  <% p.skills.each do |skill| %>
    <%= skill.name %>
  <% end %>
<% end %>

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

1 голос
/ 21 января 2011
<% @people.each do |p| %>
  <% p.skills.each do |s| %>
    <%= s.name %>
  <% end %>
<% end %>
0 голосов
/ 21 января 2011

Ваша текущая модель не поддерживает требования, т.е.

Умение принадлежит нескольким людям

У человека много навыков

Это хороший случай для ассоциации «многие ко многим».Вы ввели таблицу моста для удержания ассоциации.

class Person
  has_many :person_skills
  has_many :skills, :through => :person_skills
end

class Skill
  has_many :person_skills
  has_many :person, :through => :person_skills
end

# person_skills table with person_id and skill_id columns
class PersonSkill
  belongs_to :person
  belongs_to :skill
end

Чтобы получить навыки человека по имени:

@person.skills.find_all_by_name("foo")
@person.skills.all(:conditions => ["name LIKE ?", "foo%"])
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...