ruby on rails - Rails 3, has_one/has_many con la condición lambda
rails lambda scope (1)
Aquí mis modelos:
class User < ActiveRecord::Base
has_many :bookmarks
end
class Topic < ActiveRecord::Base
has_many :bookmarks
end
class Bookmark < ActiveRecord::Base
belongs_to :user
belongs_to :topic
attr_accessible :position
validates_uniqueness_of :user_id, :scope => :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 < ActiveRecord::Base
has_one :bookmark, :conditions => 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 alcance for_user
puede ser un objeto de usuario O una identificación de usuario .
¡Espero que esto ayude!
Preguntas similares: