2015-09-20 58 views
3

我新的軌道,寫有兩個型號jobsub_job 在我的應用程序工作的應用可以有zeroone或多個sub_jobs零個或多個協會的ActiveRecord

的的has_many協會將建立一個以jobs的許多關係。

我已經寫在各自的車型如下

#app/models/job.rb 
class Job < ActiveRecord::Base 
    has_many :sub_jobs 
end 

#app/models/sub_job.rb 
class SubJob < ActiveRecord::Base 
    belongs_to :job 
end 

現在,它意味着一個job可以有多個sub_jobs但我的問題是:

將HAS_MANY協會處理的情況時,有沒有爲一個特定的工作subjob?

+0

是的,它會處理這種情況。想想簡單的'Article'有很多'Comments'的例子。創建文章的一個實例,不依賴於任何評論,但是您的文章可以自由發佈儘可能多的評論。 –

+0

只要提到,就像你是一個學習者一樣,對於這種特殊情況你可以使用一個Job類,就像你可以擁有的:「has_many:subjobs,:class_name =>」Job「,:foreign_key =>:parent_job_id」。 –

回答

3

是的,絕對。如果你想確保至少有一份工作,你會在工作模型中進行驗證。

validates :sub_jobs, :presence => true 

但在你的情況,你不需要那麼,所以你不要把它英寸

任何工作記錄,沒有相關只會返回一個空數組子作業記錄...

p my_job.sub_jobs 
=> [] 
1

當has_many關聯處理的情況下,沒有subjob一個特定的工作?

簡短的回答:yes

-

龍答:

Rails的是不是一個神奇的精靈,它只是一個layer of abstraction來處理請求&關係數據庫。

這意味着如果你有一個has_many關聯,你真的真的告訴Rails是使用SQL來查找關聯表中的原始模型的任何引用。

enter image description here

You can read more here

這並不意味着你有有一個關聯記錄的「許多」實例,或者甚至你必須有。它只是意味着Rails將在相關表中查找相應的foreign_key的相關記錄。

例如...

#app/models/job.rb 
class Job < ActiveRecord::Base 
    # columns id | title | description | created_at | updated_at 
    has_many :sub_jobs 
end 

#app/models/sub_job.rb 
class SubJob < ActiveRecord::Base 
    # columns id | job_id | title | etc 
    belongs_to :job 
end 

job_id列是foreign_key,這樣就是Rails會用它來查找任何相應的記錄。

然後你可以這樣做:

#app/controllers/jobs_controller.rb 
class JobsController < ActionController::Base 
    def show 
     @job = Job.find params[:id] 
    end 
end 

#app/views/jobs/show.html.erb 
<% if @job.sub_jobs.any? %> 
    <% @job.sub_jobs.each do |sub| %> 
     <%= sub.title %> 
    <% end %> 
<% end %> 

如果不存在關聯sub_jobs,它只是不把任何東西了。