Как я могу перечислить все задачи, которые доступны для пользователя? - PullRequest
0 голосов
/ 31 мая 2018

Я пытаюсь запросить все задачи, которые пользователь еще не выполнил.

Я создаю модель с именем state

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

. Class Пользователь и класс Task имеют отношение 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)

Любая помощь приветствуется!

Ответы [ 3 ]

0 голосов
/ 31 мая 2018

Я не могу проверить это в данный момент, но я думаю, что вы хотите использовать , включая .Примерно так должно работать:

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

Вы также можете узнать больше об указании условий здесь

Но если я не ошибаюсь, вы также можетепросто получите все задачи, которые пользователь еще не выполнил таким же образом:

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

- engineermnky говорит, что я ошибаюсь.

0 голосов
/ 01 июня 2018
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})

Этот подход начинается с определения того, что вы хотите, чтобы результат был набором задач.Таким образом, вы хотите запросить модель задач, чтобы получить такой результат.

Ассоциация current_user.states позволит вам запрашивать состояния, но вам нужно связать это с запросом по задачам, поэтому связывание ассоциаций не будетполучить вас, где вы хотите получить.

0 голосов
/ 31 мая 2018

Обновите свои 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)
...