2011-01-21 24 views
1

我有一个简单的问题,但找到解决方案并不那么简单。访问一个视图内的其他模型值,简单但复杂?

我有两个型号,人员,技能
人有许多技能
技能属于人

在数据库中,Person表有一个skill_id也更是把ID从技能表作为外键。

在视图中,我想按名称列出该人员的技能,我可以通过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 %> 
+0

请用4个空格缩进,或通过使用\`直列正确格式的代码。 – 2011-01-21 11:07:38

+0

技能应该承担user_id:这是你设置的belongs_to – apneadiving 2011-01-21 11:09:28

+0

`人has_many:skills`意味着Person是该关联中的Parent。那么如何在Person模型中将`skill_id`设置为外键。 Rather Skill模型应该将Person作为参考。其实这是一个多对多的场景。一项特殊技能可以被许多人共享。所以你可能会重新考虑数据库结构。 :)您可以尝试使用连接模型来表示该模型,如下所示: – Rohit 2011-01-21 12:03:21

回答

2

你说你有has_many :skills。但是然后你继续说,你在persons表上有skill_id,这是不一致的。你想要什么?

你想让一个人拥有一个特定的技能,在这种情况下,你现在拥有的数据库方式是好的,但模型明智不是。在这种情况下Person模型就必须有belongs_to :skillSkill模型就必须有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
<% @people.each do |p| %> 
    <% p.skills.each do |s| %> 
    <%= s.name %> 
    <% end %> 
<% end %> 
0

您当前的模型设计不支持的要求,即

技能属于多个人

人有许多技能

这是很好的情况下,对于许多到多种协会。你已经引入了一个桥表来保存关联。

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%"]) 
相关问题