Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

How can I access a Rails scope lambda without calling it?

I would like to access the lamda defined in a rails scope as the lambda itself and assign it to a variable. Is this possible?

So if I have the following scope

scope :positive_amount, -> { where("amount > 0") }

I would like to be able to put this lambda into a variable, like "normal" lambda assignment:

positive_amount = -> { where("amount > 0") }

So something like this:

positive_amount = MyClass.get_scope_lambda(:positive_amount)

For clarification, I'm wanting the body of the method that I generally access with method_source gem via MyClass.instance_method(method).source.display. I'm wanting this for on-the-fly documentation of calculations that are taking place in our system.

Our invoicing calculations are combinations of smaller method and scopes. I'm trying to make a report that says how the calculations were reached, that uses the actual code. I've had luck with instance methods, but I'd like to show the scopes too:

enter image description here

Edit 1:

Following @mu's suggestion below, I tried:

Transaction.method(:positive_amount).source.display

But this returns:

singleton_class.send(:define_method, name) do |*args|
  scope = all
  scope = scope._exec_scope(*args, &body)
  scope = scope.extending(extension) if extension
  scope
end

And not the body of the method as I'd expect.

like image 502
pixelearth Avatar asked Dec 13 '25 02:12

pixelearth


1 Answers

If you say:

class MyClass < ApplicationRecord
  scope :positive_amount, -> { where("amount > 0") }
end

then you're really adding a class method called positive_amount to MyClass. So if you want to access the scope, you can use the method method:

positive_amount = MyClass.method(:positive_amount)
#<Method: MyClass(...)

That will give you a Method instance but you can get a proc if you really need one:

positive_amount = MyClass.method(:positive_amount).to_proc
#<Proc:0x... (lambda)>
like image 95
mu is too short Avatar answered Dec 14 '25 15:12

mu is too short



Donate For Us

If you love us? You can donate to us via Paypal or buy me a coffee so we can maintain and grow! Thank you!