好吧,基本上我是用RoR api构建NuxtJs网站的,每次我进入特定页面(my_picks)时,我都会使Rails Membership
控制器经历一个称为create_missing_membership_picks
的事前动作,基本上这是什么
对不起,很难解释。我正在寻找一种更好的方法来实现这一目标,也许有一种方法可以使用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,而且我觉得它看起来更干净。