Динамический named_scope в зависимости от определенных критериев - PullRequest
3 голосов
/ 10 марта 2011

дорогой, у меня есть Student модель, в которой я указал name_scope, например. from_program, from_year, from_school, has_status, from_course и т. Д. *

Есть ли в любом случае, что я могу динамически связать различные named_scope вместе в зависимости от определенных критериев во время выполнения?

Например,

, если пользователь, получающий доступ к данным, из Финансового отдела, я хочу иметь возможность связывать from_school и has_status только вместе. если пользователь является лектором, я хочу иметь возможность связывать from_course, from_school вместе и так далее ...

я должен использовать named_scope? или я должен просто вернуться к старому доброму способу определения условий?

спасибо за ваши предложения заранее! =) Кстати, я использую рельсы 2,3

Ответы [ 2 ]

5 голосов
/ 10 марта 2011

Я не уверен, если я понял, но я думаю, что вы могли бы сделать что-то вроде этого:

class Student

  named_scope from_program, lambda{|program| :conditions => {:program => program}}
  named_scope from_year, lambda{|year| :conditions => {:year => year}}
  named_scope has_status, lambda{|status| :conditions => {:status => status}}

  def self.from_finance(school, status)
    self.from_school(school).has_status(status)
  end

end

или более общий

def self.get_students(params)
  scope = self
  [:program, :year, :school, :course].each do |s|
    scope = scope.send("from_#{s}", params[s]) if params[s].present?
  end
  scope = scope.has_status(params[:status]) if params[:status].present?
  scope
end
2 голосов
/ 10 марта 2011

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

  Class User extend ActiveRecord::Base
  belongs_to :semester

  named_scope :year, lambda { |*year|
    if year.empty? || year.first.nil?
      { :joins => :semester, :conditions => ["year = #{CURRENT_SEMESTER}"]}
    else
      { :joins => :semester, :conditions => ["year = #{year}"]}
    end
    }

  end

Вы можете позвонить, как это

  User.year     # defaults to CURRENT_SEMESTER constant
  User.year()  # same as above
  User.year(nil)  # same as above; useful if passing a param value that may or may not exist, ie, param[:year]
  User.year(2010)

Таким же образом вы можете передать параметры

...