0

我在 Rails 3 应用程序中有一个多态关联,其中User可能喜欢各种类的对象。

class Favorite < ActiveRecord::Base
  belongs_to :user
  belongs_to :favoriteable, :polymorphic => true
end

class User < ActiveRecord::Base
  has_many :favorites
end

class Image < ActiveRecord::Base
  has_many :favorites, :as => :favoriteable
end

class Video < ActiveRecord::Base
  has_many :favorites, :as => :favoriteable
end

例如,我希望能够返回一个仅包含 a 的User列表favorite_images

user.favorite_images #returns a list of the images associated with the user via :favoritable

我猜有一种简单的方法可以做到这一点,但我无法弄清楚。如果您需要更多信息,请告诉我。

谢谢!

===edit==== 我知道我可以通过

favorite_images = user.favorites.collect{|f| if f.favoriteable_type=='Image'; f.favoriteable; end}

我可以为该类定义一个实例方法User并将其放入其中。我想知道是否有办法将其作为某种has_many关联。真的只是因为继续前进,将所有这些都集中在一个地方会更容易。

4

1 回答 1

0

当您创建表时,Favorite您创建了几列favoriteable_idfavoriteable_type并且您可以使用此信息来限制您的查询。

如果这样做user.favorites,您将获得所有收藏夹并限制他们只说图像,那么您可以这样做user.favorites.where(favoriteable_type: 'image'),但这只会给您最喜欢的记录,听起来您想要实际的图像。要获得这些,您可以通过映射并拉出收藏夹来做到这一点。不过,您可能希望将其包含在查询中,这样您就不会过多地访问数据库。我也会将此作为User.

def favorite_images
  favorites.includes(:favoriteable).where(favoriteable_type: 'Image').map(&:favoriteable)
end
于 2013-05-27T23:25:42.733 回答