Как объединить методы классов в Ruby on Rails? - PullRequest
0 голосов
/ 26 ноября 2018

У меня есть это в моей модели Rails 5:

def self.payable
  open.where.not(:delivery_status => "draft")
end

def self.draft
  where(:delivery_status => "draft")
end

def self.open
  where(:payment_status => "open")
end

Есть ли более элегантный способ написать первый метод?

Было бы здорово объединить вместе методы open и draft, например:

def self.payable
  open.not(:draft)
end

К сожалению, это не сработает.

Ответы [ 2 ]

0 голосов
/ 26 ноября 2018

Чтобы связать отрицательные запросы, вы можете использовать этот трюк:

def self.payable
  open.where.not(id: draft)
end

Другая альтернатива, если вам все равно, возвращается ли объект ActiveRecord::Relation, использует -, который возвращает Array:

def self.payable
  open - draft
end

Я бы лично использовал scope s вместо методов класса для запросов: https://guides.rubyonrails.org/active_record_querying.html#scopes. Итак:

scope :draft, -> { where(:delivery_status => "draft") }
scope :open, -> { where(:payment_status => "open") }
scope :payable, -> { open.where.not(id: draft) }
0 голосов
/ 26 ноября 2018

Может быть, вы можете использовать области?

scope :payable, -> { open.where.not(:delivery_status => "draft") }

Вы можете использовать это так

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