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

Responder a