class Container < ActiveRecord::Base
has_many :bottles
end
class Bottle < ActiveRecord::Base
belongs_to :container
def self.find_all_from_container(container)
container.bottles.find(:all)
end
end
i was asking myself if there was a better way to write the function find_all_from_container : i can call it from an instance of Container but how to pass the container instance directly (ie without giving the argument). To replace this :
I should have add more code in find_all_from_container function. The idea is not to get every entries but to scope entries and perform some actions on them, like :
It really helps if you can ask your question with exact code you're
using.
actually, there is no code about this, i just want to know if it is
possible to get the instance without explicitly giving it in the call.
This is more by curiosity rather than a strict code question.
The thing is, the instance is the class object when you call a class
method:
class C
end
def C.greet
puts "Hi from #{self}"
end
C.greet # Hi from C
There's no instance of C involved; you're sending the message directly
to C. A class is (by design) an entirely different object from its
instances (except for constants, which an instance method can refer
to from "below", and except for class variables, which are weird and
quasi-global).
It's possible to engineer things so that a class method can have
access of a sort to an instance via a block. Here's an example (and
if you look at the source code for AR associations, which let you do
things like this, you'll see some much more highly-evolved examples):
class A
def self.c_method(&block)
include Module.new { define_method("m", &block) }
end
end
class B < A
c_method { puts "Hi; I'm #{self}." }
end
B.new.m # Hi; I'm #<B:0x1ea08c>.
It's not exactly what you want, but it might give you some ideas.