【问题标题】:Get all related instances from has_many through relationship of a polymorphic class通过多态类的关系从has_many中获取所有相关实例
【发布时间】:2016-03-16 18:29:06
【问题描述】:

我正在尝试为用户在我的项目中点赞内容创建方法。为此,我设置了如下的多态关系

赞表

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:一个用户有很多赞,并且通过这些赞获得了许多时事通讯、礼品卡和故事。

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

【问题讨论】:

    标签: ruby-on-rails activerecord polymorphism has-many-through


    【解决方案1】:

    对我来说,这对于一个域来说是非常难以理解的,实际上是非常简单的。也许您有更大的理由来实现它,但这是我对 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 等单独查看每个类别。

    【讨论】:

    • 最终自己解决了这个问题,但感谢您的帮助!
    • 太棒了!请添加您的答案!
    【解决方案2】:

    终于弄明白了。只是有一些小的语法错误

    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
    

    【讨论】:

      猜你喜欢
      • 2011-05-06
      • 1970-01-01
      • 2011-09-11
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多