创建特定范围 HABTM Rails 6
create specific scope HABTM Rails 6
我有一个用户模型和一个对话模型。用户有很多对话,对话有很多用户,所以我通过加入 table :conversations_users[=23 使用 has_and_belongs_to_many 关系=].我使用的方法是return特定用户之间的对话(按用户id):
def find_conversation_between_users(ids)
conversation = nil
conversations = Conversation.all
if conversations.present?
conversations.each do |conv|
next unless conv.user_ids == ids.sort
conversation = conv
end
end
end
class Conversation < ApplicationRecord
has_and_belongs_to_many :users
end
class User < ApplicationRecord
has_and_belongs_to_many :conversations
end
它可以工作,但如果我们有成千上万的对话,它就不会有效,并且迭代每个对话将花费太多时间。
因此,我尝试通过相关 user_ids [1 , 2, 3].
创建 return 特定对话的范围
scope :by_user_id, ->(user_ids) { joins(:conversations_users).where([ conversations_users: { user_id: user_ids } ]) }
但是不行。
试试这个方法:
class Conversation < ApplicationRecord
has_and_belongs_to_many :users
scope :by_user_id, ->(ids) { joins(:users).where(users: { id: ids }).group(:id).having("count(*) >= ?", ids.size) }
end
我有一个用户模型和一个对话模型。用户有很多对话,对话有很多用户,所以我通过加入 table :conversations_users[=23 使用 has_and_belongs_to_many 关系=].我使用的方法是return特定用户之间的对话(按用户id):
def find_conversation_between_users(ids)
conversation = nil
conversations = Conversation.all
if conversations.present?
conversations.each do |conv|
next unless conv.user_ids == ids.sort
conversation = conv
end
end
end
class Conversation < ApplicationRecord
has_and_belongs_to_many :users
end
class User < ApplicationRecord
has_and_belongs_to_many :conversations
end
它可以工作,但如果我们有成千上万的对话,它就不会有效,并且迭代每个对话将花费太多时间。 因此,我尝试通过相关 user_ids [1 , 2, 3].
创建 return 特定对话的范围scope :by_user_id, ->(user_ids) { joins(:conversations_users).where([ conversations_users: { user_id: user_ids } ]) }
但是不行。
试试这个方法:
class Conversation < ApplicationRecord
has_and_belongs_to_many :users
scope :by_user_id, ->(ids) { joins(:users).where(users: { id: ids }).group(:id).having("count(*) >= ?", ids.size) }
end