Mysql 用于加入的ActiveRecord查询具有且属于多个关系

Mysql 用于加入的ActiveRecord查询具有且属于多个关系,mysql,ruby-on-rails,ruby,activerecord,Mysql,Ruby On Rails,Ruby,Activerecord,我有3个RubyonRails表:Users、Groups和post(还有一个连接表“Groups\u Users”,用于has\u和\u-beliens\u-to\u-many) 以下是相关的表格定义: create_table "posts", force: true do |t| t.integer "user_id" t.integer "group_id" t.datetime "created_at" t.datetime "updated_a

我有3个RubyonRails表:Users、Groups和post(还有一个连接表“Groups\u Users”,用于has\u和\u-beliens\u-to\u-many)

以下是相关的表格定义:

  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
帖子的组可能为空,因此用户可以在没有任何组的情况下发表一般帖子(Group_id==nil),也可以在他们所属的组中发表帖子

我正在尝试找出是否有一个活动记录查询可以为我提供: (1) 来自任何用户的所有常规帖子(无群组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

您不能在同一查询中使用该结果(如果您使用
联合编写完整查询,则可以使用该结果)。因为您的条件应用于同一字段,因此您应该有两个不同的查询

对于一般职位,你可以试试这个

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) ) }

希望这能对您有所帮助

谢谢。我是新来的,不能投票,但你的回答很有帮助!