Esto puede ser una pregunta simple, pero parece que estoy tirando de mi cabello para encontrar una solución elegante aquí. Tengo dos clases del modelo ActiveRecord, con una asociación has_one y belongs_to entre ellos:Encontrar nil tiene_una asociación en donde consulta
class Item < ActiveRecord::Base
has_one :purchase
end
class Purchase < ActiveRecord::Base
belongs_to :item
end
Busco una manera elegante de encontrar todos los objetos artículo, que no tienen objeto de compra asociado a ellos, a ser posible sin tener que recurrir a tener un booleano is_purchased
o un atributo similar en el artículo.
Ahora mismo tengo:
purchases = Purchase.all
Item.where('id not in (?)', purchases.map(&:item_id))
que funciona, pero parece ineficaz para mí, ya que está llevando a cabo dos consultas (y compras podría ser un conjunto de registros masiva).
carriles de rodadura 3.1.0
¡Ese enlace es perfecto! La unión es más o menos exactamente lo que necesitaba, solo tuve que sustituir el lugar de arriba con 'where ('' purchase.item_id IS null '')' y está bien. ¡Gracias! –
Si usa 'has_many' o' has_one' puede lograr la unión sin tener que escribir la consulta real usando 'Item.join (: compras)' –