【问题标题】:show all companies that have a job显示所有有工作的公司
【发布时间】:2015-01-16 18:12:31
【问题描述】:

我在工作和公司之间有关联,其中公司 has_many: jobs 和工作 belongs_to: company。现在我正在尝试访问一个只有公司有工作的页面,因此我的控制器中有此代码

def recruiting
  @companies = Company.all
end

这是我的招聘页面

<% @companies.each do |company| %> 
  <% unless company.job.nil? %>
   <%= link_to company.name, company_path(company), title: "#{company.name}" %>
<% end %> 
<% end %>

这不起作用并给我一个错误undefined method job'

【问题讨论】:

  • 这不是最好的方法。它遍历所有公司记录并仅跳过没有工作的记录。您可以直接在 SQL 中执行此操作以节省执行时间。 (见这个答案:stackoverflow.com/questions/18082096/…

标签: ruby-on-rails ruby ruby-on-rails-4 associations


【解决方案1】:

如果您想返回有工作的公司,而不必担心视图中的 if/unless 逻辑,您可以这样做:

def index 
  @companies = Company.joins(:jobs).uniq
end

但是,如果您想返回有工作和没有工作的公司,则应该包括工作,这样您就不会在循环的每次迭代中进行 SQL 调用。

@companies = Company.includes(:jobs)

【讨论】:

  • 这是一个更好的答案,您不应该在视图层的记录中进行过滤
【解决方案2】:

请将&lt;% unless company.job.nil? %&gt; 替换为&lt;% if company.jobs.any? %&gt;

【讨论】:

  • 我已经替换为除非 company.jobs.empty?它正在工作
  • 那是另一种选择:P 只要你喜欢“除非”多于“如果”:P
  • 这不是最好的方法。它遍历所有公司记录并仅跳过没有工作的记录。您可以直接在 SQL 中执行以节省执行时间
【解决方案3】:

当你有一个 has_one 关系时,形式是单数(工作)。在has_many中,有多个job,所以形式是复数。

所以

company.jobs.nil?

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2018-05-06
    • 1970-01-01
    • 2016-09-30
    • 1970-01-01
    • 2020-12-10
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多