Могу ли я вызвать именованную область действия из кода модели, где она была только что определена? - PullRequest
6 голосов
/ 10 января 2011

Это моя модель, и я пытаюсь позвонить self.red, но она не работает. Это вообще возможно?

# Shirt has size and color
class Shirt < ActiveRecord::Base
    scope :red, where(:color => 'red')

    def find_red
        return self.red
    end
end

Ответы [ 4 ]

9 голосов
/ 10 января 2011

Попробуйте Shirt.red
self.red будет объектным методом.scope :red уже является методом класса, поэтому вам не нужно писать метод find_red для выполнения запроса, Shirt.red уже сделает это.

2 голосов
/ 14 августа 2014

Вы можете найти, что self.class.red предпочтительнее, чем Shirt.red, предложенный в других ответах. Его не так приятно читать, но у него есть преимущество в том, что, если имена классов меняются каждый раз, ваш код может остаться прежним.

1 голос
/ 10 января 2011

Вы вызываете метод экземпляра, возвращая self.red.

То, что вы хотите достичь, это

def find_red
    return Shirt.red
end
0 голосов
/ 07 апреля 2015

Думал, что я выброшу это, связанное с этим потоком, на случай, если кто-то наткнется на него.

Вы должны держаться подальше от вызова областей действия из методов экземпляра.Вы быстро обнаружите проблемы с производительностью.Области ВСЕГДА возвращаются в базу данных независимо от того, включены ли отношения.

Т.е.

class Show
  has_many :episodes

  def awesome_episodes
    episodes.awesome # THIS IS BAD!!
    # should stay in ruby land with episodes.select { |ep| ep.status == "awesome" } 
    # OR push a method #awesome? to the episode class and then the 
    # syntax becomes nicer: episodes.select(&:awesome?)
    # This way, the onus is on the caller to include the relationship 
  end
end

class Episode
  belongs_to :show

  scope :awesome, ()-> { where(status: 'awesome') }
end

shows = Show.includes(:episodes)

shows.map do |show|
  show.awesome_episodes # fires a query every loop
end
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...