繁体   English   中英

使Rails“包含”查询中的条件动态化

[英]Making conditions in a Rails 'includes' query dynamic

看起来很简单的任务提出了一些在我的Rails应用程序中设置关联的问题。

我有一个用于Games的模型,其中包括带datetime的game_start列以及指定游戏类型的category列。 该表可能如下所示:

  • ID:1 | 2016-02-24 03:23:00 | 体育
  • ID:2 | 2016-02-25 04:10:00 | 自由
  • 编号:3 | 2016-02-26 01:23:00 | 历史

我可以使用Quiz.all显示所有可用游戏的Quiz.all ,并按game_start时间排序。 不过,我想要做的是显示用户的游戏,他们已经签署了Registration模式。 该模型包括:

  • ID | 类别| 用户身份
  • 3 | 体育| 215
  • 4 | 免费| 301
  • 5 | 历史| 215

现在,我要做的是使用控制器返回current_user已注册的未来游戏(>Time.now)结果。

  @registration = Registration.where(user_id: current_user.id).exists? && Game.where("game_start > ?", Time.now)

尽管有&&条件,但它会返回所有将来的游戏(我相信第一个条件仅是在用户拥有任何已注册游戏的情况下着眼;如果是,则显示所有已注册游戏)。 我想将其过滤为仅将来我们的用户注册的游戏。

经过研究,我发现联接表可能不是必需的(或多态关联)。 似乎我可以使用:includes创建此条件。

将原始控制器对象修改为还具有以下内容是否可行:

  @registration = Registration.where(user_id: current_user.id).includes(category: ???) [...] 

GameRegistration共享category属性。 在上面的示例中,是否可以使???? 动态的,以便它查看其他条件Game.where("game_start > ?", Time.now) ,返回category属性,然后使用该类别属性显示匹配的已注册游戏。

在我的示例表中,如果current_user为215,它将看到两个保留条目(ID 3和5),查询Game表,并仅返回具有匹配类别的游戏。

关于如何使用控制器提取类别并动态告诉第二个条件来查询相同类别的任何想法?

Game.rb

class Game < ActiveRecord::Base
   has_many :registrations
 end

Registrations.rb

 class Registration < ActiveRecord::Base
    belongs_to :user
    belongs_to :game
  end

嘿,而不是使用&&您可以在此处使用joins

@registrations = Registration.joins(:game).where(user_id: current_user.id).where("games.game_start > ?", Time.now)

如果您想将其加载到视图文件中,请使用includes

@registrations = Registration.includes(:game).where(user_id: current_user.id).where("games.game_start > ?", Time.now)

并在您查看文件时用作

<% @registrations.each do |registration| %>
    <%= registration.game.game_start %>
    <%= registration.category %>
  <% end %>

你可以试试

game = Game.first
game.registration

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM