代码之家  ›  专栏  ›  技术社区  ›  spas

如何从命名作用域扩展访问命名作用域参数?

  •  2
  • spas  · 技术社区  · 16 年前

    named_scope :search, lambda {|my_args| {...}} do
      def access_my_args
        p "#{my_args}"
      end
    end
    
    # Call:
    Model.search(args).access_my_args
    

    如您所见,我想访问named_scope扩展中lambda的参数。有办法吗?

    class User < ActiveRecord::Base
      named_scope :by_name, lambda {|name_from_scope| {:conditions => {:name => name_from_scope}}} do
        def change_name
         each { |i| i.update_attribute(:name, "#{name_from_scope}xyz") }
        end
      end
    end
    

    (我知道有一个按名称查找范围等…)。我要使用name_from_scope参数,该参数在作用域扩展中的作用域中传递。

    2 回复  |  直到 16 年前
        1
  •  2
  •   nessence    16 年前
    named_scope :test_scope, lambda {|id| {:conditions => {:id => id}} } do
        def test_scope_method
          each {|i| puts @proxy_options.to_yaml}
        end
      end
    

    我不相信不扩展activerecord就可以直接得到参数。

    @proxy_选项将为您提供块中的编译选项。因此,在您的示例中,您不能从范围访问name_,但可以访问@proxy_options[:conditions][:name]。

        2
  •  0
  •   nessence    16 年前

    named_scope :search, lambda {|*my_args|
        OtherClass.announce_search_for_model(my_args, self.class)
        { :conditions => ['created_at < ?', my_args[:created_at]], :limit => my_args[:limit] }
    }
    
    args = {:created_at > 'NOW()', :limit => 5}
    Model.search(args)
    

    如果你想观察传递到命名范围的东西,那么我会在lambda中这样做。

    命名范围结果将始终是一个结果,就像您使用了Model.find一样。这是rails的一个功能,因此如果您想要不同的功能,您需要用一个模块覆盖rails的功能。我不建议这样做,因为命名范围扩展是为了简化查找程序,而不是观察参数。