Rails 5: Использование функции модели в области видимости - PullRequest
0 голосов
/ 30 сентября 2019

Я пытаюсь использовать функцию модели в области видимости, и мне было интересно, возможно ли что-то подобное?

class WeighIn < ApplicationRecord
    belongs_to :client

    scope :overweight, -> { where("current_weight >= ?", target_weight) }

    def target_weight
        client.target_weight
    end
end

Когда я звоню WeighIn.overweight, я вижу ошибку:

undefined local variable or method `target_weight' for #<WeighIn::ActiveRecord_Relation:0x007fb31baa1fb0>

... что имеет смысл, поскольку client_id меняется в зависимости от weigh_in. Есть ли другой способ задать этот вопрос?

Ответы [ 2 ]

3 голосов
/ 01 октября 2019

Я предполагаю, что вы хотите сделать что-то вроде weigh_in.overweight, чтобы получить все WeighIn с весом, превышающим weigh_in.target_weight. Вы не можете делать это так, как хотите, так как область действия - это в основном метод класса, а target_weight - метод экземпляра.

Что вы можете сделать, это добавить аргумент в область действия:

scope :overweight, ->(weight) { where("current_weight >= ?", weight) }

Затем добавьте метод экземпляра

def overweight
  WeighIn.overweight(target_weight)
end

и теперь weigh_in.overweight возвращает то, что вы хотите.

РЕДАКТИРОВАТЬ: если вы хотите получить все overwight weight_in, связанные с его пользователемвы должны присоединиться к таблицам, как ответ @ Майкельсона, что-то вроде:

scpoe :overweight, -> { joins(:clients).where('current_weight >= clients.target_weight') }
0 голосов
/ 01 октября 2019

может быть, что-то вроде этого будет работать

область действия: избыточный вес, -> {соединения ("клиенты"). Где ("current_weight> = clients.current_weight")}

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...