【问题标题】:ActiveRecord query for joining has_and_belongs_to_many relationActiveRecord 查询加入 has_and_belongs_to_many 关系
【发布时间】:2015-01-14 02:16:16
【问题描述】:

我有 3 个 Ruby on Rails 表:用户、组和帖子(加上 has_and_belongs_to_many 的连接表“groups_users”).....

以下是相关的表定义:

  create_table "posts", force: true do |t|
    t.integer  "user_id"
    t.integer  "group_id"
    t.datetime "created_at"
    t.datetime "updated_at"
  end

  create_table "groups", force: true do |t|
    t.datetime "created_at"
    t.datetime "updated_at"
  end

  create_table "users", force: true do |t|
    t.datetime "created_at"
    t.datetime "updated_at"
  end

  create_table "groups_users", id: false, force: true do |t|
    t.integer "user_id",  null: false
    t.integer "group_id", null: false
  end

还有模特:

Group Model:
    has_and_belongs_to_many :users, dependent: :destroy
    has_many :posts, inverse_of: :group, dependent: :destroy

User Model:
    has_many :posts, inverse_of: :user, dependent: :destroy
    has_and_belongs_to_many :groups, dependent: :destroy
    has_many :groupposts, through: :groups, source: :posts, class_name: "Post"

Post Model:
    belongs_to :group, inverse_of: :posts
    belongs_to :user, inverse_of: :posts

帖子的组可能为 Null,因此用户可以在没有任何组的情况下发布一般帖子 (group_id == nil),或者他们可以在他们所属的某个组中发布帖​​子。

我试图弄清楚是否有一个 Active Record Query 可以给我: (1) 任何用户的所有一般帖子(无 group_id),加上 (2) 用户所属的任何组的所有帖子。

比如:

Post.where(:group_id => nil)

唯一加入:

@user.groupposts

我认为这是在附近的东西:

Post.includes(:groups [:users]).where("(posts.group_id IS NULL) OR (posts.groups.users CONTAINS ?)", @user.id) # THIS IS NOT CORRECT, THE SECOND HALF OF THE 'OR' STATEMENT IS GARBAGE

【问题讨论】:

    标签: mysql ruby-on-rails ruby activerecord


    【解决方案1】:

    您不能在同一个查询中获得该结果(如果您使用UNION 编写完整的查询,您可以获得它),因为您的条件应用于同一字段,您应该有 2 个不同的查询。

    对于一般帖子,你可以试试这个

    Post.where("group_id is null")
    #or in scope
    scope :general_posts, lambda { where ("group_id is null") }
    

    来自用户组的所有帖子

    Post.where( group_id: User.uniq.pluck(:id) )
    #scope
    scope :user_groups, lambda { where( group_id:  User.uniq.pluck(:id) ) }
    

    希望对你有帮助

    【讨论】:

    • 谢谢。我太新了,无法投票,但你的回答很有帮助!
    猜你喜欢
    • 1970-01-01
    • 2021-05-13
    • 1970-01-01
    • 2011-07-18
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2015-02-27
    • 2013-04-25
    相关资源
    最近更新 更多