Pergunta

Em meu aplicativo Rails 3.2.8, tenho alguns escopos nomeados que gostaria de encadear em algumas circunstâncias.

Então, por exemplo, tenho estes dois escopos:

scope :by_status, lambda { |status| if status == "All" then WorkRequest.all else WorkRequest.find_all_by_status(status) end }
scope :in_date_range, lambda { |start_date, end_date| includes([:person, :pier_module]).where("(status_date >= ?) AND (status_date <= ?)", start_date, end_date) }

Eu os uso separadamente, mas também gostaria de poder reuni-los assim:

WorkRequest.by_status("Accepted").in_date_range("2012-01-01", "2012-10-02")

Quando tento, ele reclama que in_date_range não é um método de Array.

Mas eu tenho outro escopo,

scope :active, includes([:person, :pier_module]).where("status = 'New Request'")

e se eu fizer

WorkRequest.active.in_date_range("2012-01-01", "2012-10-02")

funciona!Aparentemente, o escopo ativo retorna uma relação, enquanto os escopos lambda retornam matrizes e, portanto, não podem ser encadeados.

Eu adoraria saber por que existe a diferença entre escopos mais simples e escopos lambda, como os parâmetros afetam isso e se há algo que eu possa fazer além de escrever um escopo combinado, o que fiz.

scope :by_status_in_date_range, lambda { |status, start_date, end_date|  includes([:person, :pier_module]).where("(status = ?) AND (status_date >= ?) AND (status_date <= ?)", status, start_date, end_date) }

Funciona, mas não muito SECO (já que também preciso dos escopos individuais) ou Rails-ish.Pesquisando aqui e em outros lugares, vi perguntas semelhantes, mas nenhuma que pareça se aplicar a esta situação, onde estou tentando encadear dois lambdas com parâmetros.

Foi útil?

Solução

Isso acontece porque no seu escopo

scope :by_status, lambda { |status| if status == "All" then WorkRequest.all else WorkRequest.find_all_by_status(status) end }

métodos all e find_all_by_status retorna Array em vez de ActiveRecord::Relation.Você deve substituí-lo por where por exemplo.

scope :by_status, lambda { |status| where(:status => status) unless status == "All" }
Licenciado em: CC-BY-SA com atribuição
Não afiliado a StackOverflow
scroll top