2

ここに私のモデル:

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

関連するtopicsforですべてを取得したい。ATM、私は:current_userbookmark

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

これは可能ですか?代替手段はありますか?

ありがとうございました!

4

1 に答える 1

6

*うーん、あなたの質問を理解できたかどうかわかりませんが、これが役立つかもしれません:

# 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 User オブジェクトまたはユーザー ID にすることができます

お役に立てれば!

同様の質問:

于 2012-11-22T15:54:38.520 に答える