Rails 3, has_one / has_many con la condición lambda

Aquí mis modelos:

class User < ActiveRecord::Base has_many :bookmarks end class Topic < ActiveRecord::Base has_many :bookmarks end class Bookmark  :topic_id end 

Quiero buscar todos los topics con, para current_user , el bookmark asociado. ATM, lo hago:

 Topic.all.each do |t| bookmark = t.bookmarks.where(user_id: current_user.id).last puts bookmark.position if bookmark puts t.name end 

Esto es feo y hace demasiadas consultas DB. Me gustaría algo como esto:

 class Topic  lambda {|u| "bookmarks.user_id = #{u.id}"} end Topic.includes(:bookmark, current_user).all.each do |t| # this must also includes topics without bookmark puts t.bookmark.position if t.bookmark puts t.name end 

es posible? ¿Tengo alguna alternativa?

¡Gracias!

* Hmm. No estoy seguro de haber entendido tu pregunta, pero esto puede ayudarte:

 # code class Topic < ActiveRecord::Base scope :for_user, lambda { |user| includes(:bookmarks).where(bookmarks: { user_id: user.try(:id) || user} ) } # call Topic.for_user(current_user) # => Array of Topics 

Como puede ver, el parámetro del scope for_user puede ser un objeto de usuario O una identificación de usuario .

¡Espero que esto ayude!

Preguntas similares:

  • ¿Cómo consultar un modelo basado en el atributo de otro modelo que pertenece al primer modelo?
  • Rails active la asociación de consultas de registros con ‘exists’
  • Rails 4 scope para encontrar padres sin hijos
  • Unir múltiples tablas con registros activos