복붙노트

[RUBY-ON-RAILS] 람다 조건 3 has_one / has_many 레일

RUBY-ON-RAILS

람다 조건 3 has_one / has_many 레일

내 모델 여기 :

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

나는, CURRENT_USER를 들어, 관련 북마크를 모든 주제를 가져 싶다. ATM, 내가 할 :

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

이 못생긴 너무 많은 DB 쿼리를 수행합니다. 나는 이런 식으로 뭔가를 싶습니다 :

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

이게 가능해? 나는 어떤 대안이 있나요?

감사합니다!

해결법

  1. ==============================

    1.* 음, 나는 확실하지 않다 나는 당신의 질문을 이해하지만 당신을 도울 수 있습니다 :

    * 음, 나는 확실하지 않다 나는 당신의 질문을 이해하지만 당신을 도울 수 있습니다 :

    # 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
    

    당신이 범위 for_user의 매개 변수를 볼 수있는 사용자 개체 또는 사용자 ID가 될 수 있습니다.

    도움이 되었기를 바랍니다!

    유제:

  2. from https://stackoverflow.com/questions/13515225/rails-3-has-one-has-many-with-lambda-condition by cc-by-sa and MIT license