rails ruby-on-rails ruby ruby-on-rails-3 activerecord lambda

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: