ActiveRecord中的零个或多个关联

时间:2015-09-20 08:15:35

标签: ruby-on-rails ruby-on-rails-3

我是rails的新手并编写了一个包含两个模型jobsub_job的应用程序 在我的应用程序中,作业可以有zeroone或许多sub_jobs

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关联会处理这种情况吗?

1 个答案:

答案 0 :(得分:1)

  

当没有subjob时,has_many关联会处理这种情况   一份特别的工作?

简短回答:yes

-

答案很长:

Rails不是一个神奇的巫师,它只是一个layer of abstraction来处理请求&amp;关系数据库。

这意味着如果你有一个has_many关联,你真正告诉Rails的是使用SQL来查找关联表中对原始模型的任何引用。< / p>

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,它就不会放任何东西。