通过多态 class 的关系从 has_many 获取所有相关实例

Get all related instances from has_many through relationship of a polymorphic class

我正在尝试创建让用户喜欢我项目中的内容的方法。为此我设置了一个多态关系如下

赞table

table "likes", force: :cascade do |t|
  t.integer  "likeable_id"
  t.string   "likeable_type"
  t.integer  "user_id",       null: false
  t.datetime "created_at"
  t.datetime "updated_at"
end

型号

class User < ActiveRecord::Base
  has_many :likes, dependent: :destroy
  has_many :newsletters, through: :likes, source: :likeable, source_type: "newsletter"
  has_many :gift_cards, through: :likes, source: :likeable, source_type: "gift_card"
  has_many :stories, through: :likes, source: :likeable, source_type: "story"
end

class Like < ActiveRecord::Base
  belongs_to :user
  belongs_to :likeable, polymorphic: true
end

class Newsletter < ActiveRecord::Base
  has_one :like, as: :likeable, dependent: :destroy
  has_one :user, through: :like, source: :likeable
end

class GiftCard < ActiveRecord::Base
  has_many :likes, as: :likeable, dependent: :destroy
  has_many :users, through: :likes, source: :likeable
end

class Story < ActiveRecord::Base
  has_many :likes, as: :likeable, dependent: :destroy
  has_many :users, through: :likes, source: :likeable
end

tldr:用户有很多点赞,并且通过这些点赞有很多时事通讯、礼品卡和故事。

我的问题是,对于这种结构,获得用户喜欢的所有内容的最佳方式是什么?

对我来说,这非常难以理解,因为一个域实际上非常简单。也许您有更大的理由以这种方式实施它,但这是我对 User LikeGiftCard 模型的建议(可能有帮助也可能没有帮助!)。

class User < ActiveRecord::Base
  has_many :likes, dependent: :destroy
  has_many :liked_giftcards, through: :likes, source: :giftcard
end

class Like < ActiveRecord::Base
  belongs_to :user
  belongs_to :giftcard
end

class GiftCard < ActiveRecord::Base
  has_many :likes, dependent: :destroy
end

class Story < ActiveRecord::Base
  ...same as GiftCard
end

就我个人而言,我会发现这更容易理解。它通过 user.likes 提供对用户喜欢的所有内容的轻松访问,并允许您通过 user.liked_giftcards 等单独查看每个类别。

终于搞清楚了。只是有一些小的语法错误

class User < ActiveRecord::Base
  has_many :likes, dependent: :destroy
  has_many :newsletters, through: :likes, source: :likeable, source_type: "Newsletter"
  has_many :gift_cards, through: :likes, source: :likeable, source_type: "GiftCard"
  has_many :stories, through: :likes, source: :likeable, source_type: "Story"
end

class Like < ActiveRecord::Base
  belongs_to :user
  belongs_to :likeable, polymorphic: true
end

class Newsletter < ActiveRecord::Base
  has_one :like, as: :likeable, dependent: :destroy
  has_one :user, through: :like
end

class GiftCard < ActiveRecord::Base
  has_many :likes, as: :likeable, dependent: :destroy
  has_many :users, through: :likes
end

class Story < ActiveRecord::Base
  has_many :likes, as: :likeable, dependent: :destroy
  has_many :users, through: :likes
end