簡體   English   中英

如何查找數據庫中是否存在反向用戶輸入

[英]How to find if reversed user input exists in database

我正在創建一個信使系統,我在創建一個房間之前使用 find_or_create_by 在數據庫中查找房間,這工作正常,但我有兩個 ID,sender_id 和 receiver_id,我想弄清楚如何檢查是否有數據庫中的房間實例,在創建新房間之前反轉了 ID。

就像在數據庫房間 1 中 Sender_id = 1 和 Receiver_id = 2 一樣。如果我嘗試創建一個實例,其中 sender_id =2 和 receiver_id = 1,我希望它加載房間 1 而不是創建新實例。

房間控制器:

  def create

    @room = Room.find_or_create_by permitted_parameters

    if @room.save!
      redirect_to room_path(@room)
    else
      redirect_to rooms_path
    end
  end

  private

  def permitted_parameters
    params.require(:room).permit(:name, :sender_id, :receiver_id)
  end

創建的形式很簡單

<%= bootstrap_form_for @room do |f| %>
  <%= f.collection_select :receiver_id, User.all, :id, :first_name %>
  <%= f.hidden_field :sender_id, :value => current_user.id %>
  <%= f.submit "Save", class: 'btn btn-success' %>
<% end %>

房間.rb

class Room < ApplicationRecord
  belongs_to :user, optional: true
  has_many :messages, dependent: :destroy,
         inverse_of: :room
  has_many :users, {:through=>:messages, :source=>"user"}

end

消息文件

class Message < ApplicationRecord
  belongs_to :user, :class_name => 'User', :foreign_key => "user_id"
  belongs_to :room, inverse_of: :messages
end

用戶名

  has_many :messages, :class_name => "Message", :foreign_key => "user_id"
  has_many :rooms, :foreign_key => "sender_id"

類似這樣的信息應該會告訴您房間是否是從任一方向預訂的:

Room.where('(sender_id = :sender_id AND receiver_id = :receiver_id) OR
  (sender_id = :receiver_id AND receiver_id = :sender_id)', 
  sender_id: permitted_parameters[:sender_id], 
  receiver_id: permitted_parameters[:receiver_id]).first

如果那回來.present? 你應該知道房間已經訂好了。


更新以根據 OP 的評論刪除 where 子句中的room

這可能對你有幫助!

Room.where(sender_id: params[:sender_id],receiver_id: params[:receiver_id]).or(Room.where(receiver_id: params[:sender_id],sender_id: params[:receiver_id])).first_or_create

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM