【问题标题】:How can I list all tasks that are available for a user?如何列出可供用户使用的所有任务?
【发布时间】:2018-11-10 17:15:00
【问题描述】:

我正在尝试查询用户尚未完成的所有任务。

我创建了一个名为 state 的模型

class State < ActiveRecord::Base
  as_enum :value, %i{available inprogress completed}
  belongs_to :user
  belongs_to :task
end

class User 和 class Task 与 class state 有 has_many 关系。

我尝试过这样做,最终得到了一个数组,如下所示:

@tasks = []
current_user.states.where(value_cd: 0).each do |task|
      @tasks << state.task
end

我怎样才能通过查询来做到这一点?

我希望能达到类似的效果:

Tasks.where(state.value: :available && state.user_id == current_user.id)

感谢任何帮助!

【问题讨论】:

  • 我不知道 Ruby on rails.. 但我知道 SQL 你需要使用 LEFT JOIN
  • 用户和任务有关系吗?
  • 顺便问一下,as_enum 是什么?这是 Rails 的现代枚举功能的反向移植吗?如果您使用的是 Rails 4.1+(?),那么这现在是本机功能;您可以丢弃第三方宝石。
  • 另外,如果你通过它们的编号来引用枚举,那么你有点错过了重点!......整个想法是“计算机”使用数字,而“人类”使用有意义的名称。因此,在这种情况下(取决于您使用的实际库),应该可以执行以下操作:states.available 而不是 states.where(value_cd: 0)

标签: sql ruby-on-rails ruby postgresql ruby-on-rails-4


【解决方案1】:

我目前无法测试,但我相信你想使用includes。 像这样的东西应该可以工作:

tasks = Task.includes(:states).where(states: { value: :available, user_id: current_user.id})

您还可以阅读有关指定条件的更多信息here

但如果我没记错的话,您也可以通过这种方式获取用户尚未完成的所有任务:

current_user.tasks.map(&:states).map(&:available)

- engineersmnky 说我错了。

【讨论】:

  • 第一个很好。第二个应该完全删除
  • 因为在整个集合上映射了两次,或者因为它不会给出想要的结果?
  • 说实话
【解决方案2】:

使用专用范围更新您的 User 模型:

has_many :available_tasks, -> { where('state.id' => 0) }, through: :state

并使用:

current_user.tasks

或使用:

Tasks.joins(:state).where(
  'state.value' => 0,
  'state.user_id' => current_user.id)

【讨论】:

    【解决方案3】:
    class Task
      has_many :states
    end
    
    Task.joins(:states).where(states: {user_id: current_user.id, value: :available})
    Task.joins(:states).where.not(states: {value: :completed})
        .where(states: {user_id: current_user.id})
    

    此方法首先确定您想要的结果是任务的集合。所以你想查询 Task 模型来给你那个结果。

    current_user.states 关联将允许您查询状态,但您需要将其链接到任务查询,因此链接关联不会让您到达您想要的位置。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2018-07-08
      • 2022-07-02
      • 1970-01-01
      • 2013-03-20
      • 1970-01-01
      • 2017-04-22
      相关资源
      最近更新 更多