Mongoid habtm选择

时间:2015-01-16 01:38:05

标签: ruby-on-rails mongodb mongoid

我想弄清楚是否有一个班轮来检查是否有一对在habtm

Conversation.in(participant_ids:[current_user.id,params [:recipient_id]])。first_or_create

所以基本上我需要检查一对[发送者,接收者]或[接收者,发送者]是否已存在。如果是,请返回会话ID。如果没有,请创建一个。

我试过.in和.where,但它们并不是一直都在工作。有什么想法吗?

class Conversation
  include Mongoid::Document
  include Mongoid::Timestamps

  has_and_belongs_to_many :participants, :class_name => 'User'
  embeds_many :messages
end

def create
  @conversation = Conversation.any_of({participant_ids: [current_user.id, params[:recipient_id]]},
  {participant_ids: [params[:recipient_id], current_user.id]}).first

  if @conversation.nil?
    @conversation = Conversation.create(participant_ids: [current_user.id, params[:recipient_id]])
  end
  render json: { conversation_id: @conversation.id.to_s }
end

所以这就是我所使用的模型和方法,但似乎应该有一种更简单的方法来实现这一点。

1 个答案:

答案 0 :(得分:0)

你有两种可能性

scope :pair_exists, ->(pair){ where( :participant_ids.sort => pair.sort ) }

def self.pair_exists?(pair) where(:participant_ids.sort => pair.sort) end