2009/9/20 Aureliano Calvo <[email protected]>:
> Hola,
>
> Tengo una base de datos con 2 tablas y 2 clases de AR que las mapean:
>
> class Foo < ActiveRecord::Base
> has_many :properties
>
> # Tiene otras relaciones y valores que no son relevantes para lo que
> quiero preguntar.
> end
>
> class Property < ActiveRecord::Base
> belongs_to :foo
> # Tiene 2 campos, key (que es único en el contexto del foo al que
> pertenece) y value.
> # Ambos son strings y representan un diccionario con propiedades de cada
> foo.
> end
>
> ¿Cómo hago en una query de Active Record para encontrar todos los foo tales
> que tengan la property con key "k" y value "v"?
Lo que vos querés es encontrar Foos, así que querés que sea un método
que llames sobre Foo, y no sobre Property. Para que Foo filtre contra
los Property asociados, lo que querés hacer, es un JOIN en la base.
Para eso AR::B tiene la opción ":joins" en el método find [1].
class Foo
def self.with_properties(key, values)
all(:joins => :properties, :conditions => { "properties.name" =>
n, "properties.value" => v })
end
end
# SELECT *
# FROM foos INNER JOIN properties
# ON foos.id = properties.foo_id
# WHERE properties.name = 'k'
# AND properties.value = 'v'
Foo.with_properties("k", "v")
# SELECT *
# FROM foos INNER JOIN properties
# ON foos.id = properties.foo_id
# WHERE properties.name = 'k'
# AND properties.value IN ('v1', 'v2')
Foo.with_properties("k", ["v1", "v2"])
Saludos
-f
[1]: http://api.rubyonrails.org/classes/ActiveRecord/Base.html#M002263
> Lo único que se me ocurre es:
> Property.find( :all, :cond => ["name = ? and value = ?", "k", "v"]).map {
> |p| p.foo }
>
> ¿Está bien o hay otra forma más "activerecordesca"?
>
> ¿Y si quiero complicar la condición (ej, key=k, value=v1|v2)?
>
> Muchas gracias,
> Aureliano.
>
> _______________________________________________
> Ruby mailing list
> [email protected]
> http://lista.rubyargentina.com.ar/listinfo.cgi/ruby-rubyargentina.com.ar
>
>
_______________________________________________
Ruby mailing list
[email protected]
http://lista.rubyargentina.com.ar/listinfo.cgi/ruby-rubyargentina.com.ar