Rails:使用嵌套循环在控制器中查找匹配的替代方法

时间:2014-05-21 04:00:50

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

必须有更好的方法来做到这一点。我的Favorite模型属于User,而Applicant属于GigUser。我正在尝试有效地确定用户是否已申请Gig被收藏(<% if @application.present? %>)。

我尝试使用像@favorites.each.gig这样的东西链接集合无济于事。虽然以下Favorites的索引操作似乎有效,但它确实很冗长且效率低下。有什么更简洁的方法呢?

def index
  @favorites = Favorite.where(:candidate_id => current_candidate)
  @applications = Applicant.where(:candidate_id => current_candidate)

  @favorites.each do |favorite|
    @applications.each do |application|
      if favorite.gig.id == application.id
       @application = application
      end
    end
  end
end

class User
  has_many :applicants
  has_many :gigs, :through => :applicants
  has_many :favorites
end

class Favorite < ActiveRecord::Base
 belongs_to :candidate
 belongs_to :gig
end

class Applicant < ActiveRecord::Base
  belongs_to :gig
  belongs_to :candidate
end

class Candidate < ActiveRecord::Base
  has_many :applicants
  has_many :gigs, :through => :applicants
  has_many :favorites
end

class Gig < ActiveRecord::Base
  belongs_to :employer
  has_many :applicants
  has_many :favorites
  has_many :users, :through => :applicants
end

1 个答案:

答案 0 :(得分:0)

由于缺乏更好的答案,这就是我的想法:

-

用户

您的用户模型应该是这样构建的(我只是突出显示foreign keys,我想你无论如何都会这样):

#app/models/user.rb
Class User < ActiveRecord::Base
    has_many :applicants
    has_many :gigs, :through => :applicants, foreign_key: "candidate_id"
    has_many :favorites, foreign_key: "candidate_id"
end

这意味着您可以致电:

current_candidate.favorites
current_candidate.applicants

这样就无需您@applications@favorites查询

-

<强>收藏

您基本上想要返回boolean applicant是否属于favorite模型的一部分。实质上,对于favorite所提出的每个candidate,您都可以检查它是否有应用

我会这样做,方法是使用ActiveRecord Association Extensionfavorites方法上设置实例方法,如下所示:

#app/models/user.rb
Class User < ActiveRecord::Base
    has_many :favorites do
        def applied?
            self.applicant.exists? proxy_association.owner.gig.id
        end
    end
end

这将允许您致电:

<%= for favorite in current_candidate.favorites do %>
    <%= if favorite.applied? %>
<% end %>

这是未经测试的&amp;高度投机。不过,我希望它能给你一些想法!