【问题标题】:Rails JOINS with a twistRails 加入了一个扭曲
【发布时间】:2015-02-16 16:36:32
【问题描述】:

我已经尝试了 2 天但失败了 :) 来获得一个点赞的想法列表(基本上是帖子)。最好订购 Desc。

我已经构建了可以正常工作的想法和用户。

喜欢(社交宝石)让我头疼。 我可以添加喜欢并检索它们。而且我还可以找出一个特定想法有多少喜欢:idea.likers(User).count 并找出用户是否喜欢特定的想法:user.likes?(idea)

但我不能进行聚合,因为非标准字段名称禁止我进行 JOIN。

  create_table "likes", force: :cascade do |t|
  t.string   "liker_type"
  t.integer  "liker_id" (this is/should be user_id)
  t.string   "likeable_type"
  t.integer  "likeable_id" (this is/should be idea_id)
  t.datetime "created_at"
  end

  add_index "likes", ["likeable_id", "likeable_type"], name:    "fk_likeables"
  add_index "likes", ["liker_id", "liker_type"], name: "fk_likes"

型号:

  • like.rb - 空
  • user.rb -acts_as_liker
  • idea.rb -acts_as_likeable

有没有办法加入喜欢和想法,例如以某种方式将liker_id 与user_id 匹配?或者我应该重命名表中的字段(liker_id 到 user_id 和 likeable_id 到 idea_id)...?并添加这些:

like.rb

belongs_to :user
belongs_to :idea

idea.rb

has_many :likes, dependent: :destroy

用户.rb

has_many :likes, dependent: :destroy

提前致谢!

【问题讨论】:

    标签: ruby-on-rails join activerecord


    【解决方案1】:

    要将不同的列指定为在连接中使用的外键,您可以将foreign_key: ... 选项添加到belongs_to,如下所示:

    # app/models/like.rb
    
    belongs_to :user, foreign_key: :liker_id
    belongs_to :idea, foreign_key: :likeable_id
    

    请参阅belongs_to 上的参考文档。

    您也可以自己指定连接条件,如下所示:

    Idea.joins('inner join likes on ideas.id = likes.likeable_id').where(...)
    

    【讨论】:

    • 谢谢!那行得通。不幸的是,joins 在 SQL 中按 created_at 排序,这让我发疯,因为我需要按 like_count 排序: Idea.joins('inner join likes on ideas.id = likes.likeable_id').select('likes.*, COUNT( *) AS like_count、ideas.title、ideas.intro').group('likeable_id').order('like_count DESC')
    • 默认排序很可能是由default_scope 引起的。请参阅链接文档,了解如何在查询中忽略 default_scopes。
    • 就是这样!完毕。非常感谢你的方式! :) ps:现在我记得我在模型中设置了默认范围 ps2:你看起来不像 33 :)))
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-04-25
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多