如何将此逻辑移动到控制器中,是否需要?

时间:2018-04-27 20:53:55

标签: ruby-on-rails

好的,我需要问一下如何将其移入控制器

- if UserGroup.where("group_id = ? AND user_id = ?", annoucement.group_id, current_user.id).exists? and annoucement.exp_date >= Date.today

这是我观点的一部分,我不知道如何将每个值传递给它

#Part of index.html.haml

- @annoucements.each do |annoucement|
    - if UserGroup.where("group_id = ? AND user_id = ?", annoucement.group_id, current_user.id).exists? and annoucement.exp_date >= Date.today
      %tr{id: "annoucement_#{annoucement.id}"}
        %td= annoucement.title
        %td= annoucement.description

1 个答案:

答案 0 :(得分:2)

你绝对是在正确的轨道上。像这样的逻辑不属于视图,甚至可能不在控制器中。你想尽可能地将逻辑“反向”推入控制器,也可能推进到模型中。视图中的逻辑是代码气味:D

我相信你想要的是left_outer_join。看起来UserGroup是用户和组之间的连接表,对吧?如果是这种情况,则命名约定为UsersGroup。我打算做这个假设。我的代码可能与你的代码不符,所以要适应口味。

这是使用Rails 5 left_outer_join https://blog.bigbinary.com/2016/03/24/support-for-left-outer-joins-in-rails-5.html

但是在Rails 5之前可以使用joins完成同样的事情 https://apidock.com/rails/ActiveRecord/QueryMethods/joins

Announcement.left_outer_joins(:users_groups).where(users_groups: { user_id: current_user.id }).uniq

这将获得具有用户组的所有公告,然后使用当前用户ID对其进行过滤。

您可以将它放在控制器中并将其分配给变量,或者您可以在模型中创建范围,或者在无数其他选项中创建范围。祝你好运!