Rails 3,has_one / has_many和lambda条件

在这里我的模特:

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获取关联bookmark所有topics 。 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 

这是丑陋的,做太多的数据库查询。 我想这样的东西:

 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 

这可能吗? 我有其他select吗?

谢谢!

*嗯,我不知道我理解你的问题,但这可能会帮助你:

 # 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

希望这可以帮助!

类似的问题:

  • 如何根据属于第一个模型的另一个模型的属性来查询模型?
  • Rails活动logging查询与“存在”的关联
  • Rails 4的范围是find没有孩子的父母
  • join多个具有活动logging的表格