2011-06-17 46 views
0

我想實施這個項目查看:Rails的數據來自的has_many和Has_many_and_belongs_to_many

http://img7.imagebanana.com/img/cnb46ti2/relationships.png

  • 我要讓查看員工的節目頁面
  • 的對員工的技能員工有一個職位,並且每個職位都具有該職位的員工需要知道的技能
  • 因此,如果我理解正確,職位和技能具有n:m關係,並且他們需要has_many_and_belongs_的連接表to_many關係。因爲職位包含許多技能,而且每項技能都屬於許多職位。

現在我的問題

  1. 的position_skill表 - >是它更好地使用一個has_and_belongs_to_many關係,所以這個表有沒有自己的ID或者是更好地使用的has_many:通過關係?我想最好使用has_and_belongs_to_many關係,因爲這個關係表裏面不會有任何進一步的信息,而不僅僅是兩個鍵。我對嗎?
  2. 如果我採取has_and_belongs_to_many - 關係,是我需要寫入模型的唯一事情嗎?

一個)class Position < ActiveRecord :: Base (...) has_and_belongs_to_many :skills (...)

b)中class Skill < ActiveRecord :: Base (...) has_and_belongs_to_many :positions (...)

c)中成分貝\遷移def self.up create_table :positon_skill, :id => false do |t| (...) 此後,位置和技能相互連接?是對的嗎?我忘了什麼嗎?

  • 如果這是正確的,我該如何讓員工的展示頁上的技能視圖?員工有1個職位,這個職位有幾個技能......我需要寫什麼代碼寫入員工的show.html.erb?像<%= employee.position.skill %>?我還需要渲染一些東西嗎?對不起,我很困惑,我想我在網上讀了太多的信息.​​.....或者是否有任何網站上的描述,其中正確描述了我需要什麼?

非常感謝,並且很抱歉那個多餘的問題。

回答

0
  1. 如果你確定你不會想要的任何信息後添加到position_skills表,has_and_belongs_to_many將正常工作。但是,如果您稍後改變主意,並且設置起來難度更大,則has_many :through會更加靈活。

  2. 如果使用has_and_belongs_to_many,則只需在模型和數據庫表中使用position_id:integerskill_id:integer字段的關聯聲明。似乎你已經得到了。

爲了能夠訪問employee.position.skills在你看來,你需要急切地加載員工的關聯。你可以試試下面的:

class EmployeesController < ApplicationController 
    ... 
    def show 
    @employee = Employee.find(params[:id], :include => { :position => :skills }) 
    end 
    ... 
end 

我認爲,如果你堅持has_and_belongs_to_many應該工作,但是如果你去has_many :through(我推薦),你需要使用:include => { :position => { :position_skills => :skills } }

+0

@Luke: 感謝這個詳細的答案!可悲的是,它與has_and_belongs_to_many不兼容。這就是我創建所有其他表和它們之間的關係後所做的事情。 1)路由\ create_position_skill 3.我用命令'耙分貝:migrate'所以它沒有創建ID 4.我填的表格position_skill SQLite中DatabaseBrowser 5.然後我就想,如果位置嘗試和技能真的相互關聯 – Kirinriki

+0

所以我寫了rails控制檯'first_skill = Skill.first'(當然工作)和'first_skill.positions'發生了一個錯誤:'ActiveRecord :: Statement Invalid:Could沒有找到表positions_skills' - >好像它沒有找到該表,雖然它被遷移。但我想知道:爲什麼它搜索「positions_skills」而不是「position_skills」? – Kirinriki

+0

與has_and_belongs_to_many提到的方法有關的另一個問題: 我不需要在position_skills的模型中寫入任何內容? Nothing like'belongs_to:position belongs_to:skill'? – Kirinriki

0

這就是它在你的圖表中的樣子。考慮以下幾點:

class Employee < ActiveRecord :: Base 
    belongs_to :position 
    ... 
end 

class Position < ActiveRecord :: Base 
    has_many :employees 
    has_many :position_skills 
    has_many :skills, :through => :position_skills 
    ... 
end  

class PositionSkill < ActiveRecord :: Base 
    belongs_to :position 
    belongs_to :skill 
    ... 
end 

class Skill < ActiveRecord :: Base 
    has_many :position_skills 
    has_many :positions, :through => :position_skills 
    ... 
end 

唯一的問題是員工被綁在一個位置上。雖然這個職位通過職位有許多技能。我會將其更改爲職位belongs_to員工和員工has_many職位。這使得它可以跟蹤從一個位置移動到另一個位置的員工。讓我知道你是否需要進一步的信息。

+0

很大,奏效完美!我還將代碼添加到員工控制器中。在一個有趣的例子中,代碼**的意思是:has_and_belongs_to_many **':include => {:position =>:skills}',並且爲**提供的代碼has_many:through ** - 方法' :通過 :include => {:position => {:position_skills =>:skills}}'首先給我一個錯誤:'ActiveRecord :: ConfigurationError ---名爲'skills'的關聯未找到;也許你拼錯了它?',但我把:技能改成:技能,現在它起作用了。 – Kirinriki

+0

但現在也爲這種情況下的另一個問題: 我現在看起來像這樣後我使用了'<%= @ employee.position.skills%>' [鏈接] http://img7.imagebanana.com/img /p2rjbbev/viewskills.PNG 當然,我只是想讓視圖'技能1','技能2','技能4'而不是所有這些無用的信息。爲了得到這個結果,我需要另一個命令而不是'<%= @ employee.position.skills%>?像'@employee.position.skills:select =>類別'''我真的不知道! – Kirinriki