重构方法可以进行良好的SQL查询

时间:2019-08-21 00:38:50

标签: sql ruby-on-rails refactoring jsonapi-resources

好吧,基本上我是用RoR api构建NuxtJs网站的,每次我进入特定页面(my_picks)时,我都会使Rails Membership控制器经历一个称为create_missing_membership_picks的事前动作,基本上这是什么

  1. 首先,它将获取特定锦标赛的所有match_id
  2. 然后,它将遍历成员当前具有的每个选择,并获取与其相关的每个match_id。
  3. 然后它将用那些成员已经拥有的匹配ID过滤那些匹配ID
  4. ,最后为与他没有任何选择相关的所有比赛创建选择。这样,会员就可以为比赛选择。

对不起,很难解释。我正在寻找一种更好的方法来实现这一目标,也许有一种方法可以使用SQL来获取成员没有选择的所有匹配项。我只是不知道要进行这样的查询...这是我当前的代码。

让我们说一场比赛的所有比赛都是match_ids match_ids = [12,3,40,291,43]
我选择的所有比赛都是 picks_match_ids = [3,40]

所以我很想念[12,291,43]

我想用这些匹配项[12,291,43]和我的会员ID [4]创建精选。 Pick.create match_id: match_id, membership: @membership

def create_missing_membership_picks
  match_ids = @membership.group.tournament.match_ids
  if match_ids
     if @membership.picks.empty?
        match_ids.each do |match_id|
           Pick.create match_id: match_id, membership: @membership
        end
     else
        @membership.picks.each do |pick|
           match_ids.delete(pick.match_id)
        end
        if match_ids.present?
           match_ids.each do |match_id|
               Pick.create match_id: match_id, membership: @membership
           end
        end
     end
  end
end

更新 我改变了一切。由于成员资格是比赛的必要关系,因此我在Match模型中做到了

after_create :create_picks_for_members

def create_picks_for_members
    tournament.groups.each do |group|
      group.memberships.each { |m| Pick.create membership: m, match: self }
    end
end

我也在Membership模型中做到了这一点。

after_create :create_picks_for_member

def create_picks_for_member
  matches = group.tournament.matches
  matches.each { |match| Pick.create membership: self, match: match }
end

这样,我不需要任何控制器中的before_actions,而且我觉得它看起来更干净。

0 个答案:

没有答案