Как найти, если обратный пользовательский ввод существует в базе данных - PullRequest
1 голос
/ 05 марта 2020

Я создаю систему обмена сообщениями и использую find_or_create_by, чтобы найти комнату в базе данных перед ее созданием, и это работает нормально, но у меня есть два идентификатора, sender_id и receive_id, и я пытаюсь выяснить, как проверить, в базе данных есть экземпляр комнаты с обратными идентификаторами перед созданием новой комнаты.

Как если бы в комнате базы данных 1 было Sender_id = 1 и Receiver_id = 2. Если я пытаюсь создать экземпляр, где sender_id = 2 и receive_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 %>

room.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

message.rb

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

user.rb

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

Ответы [ 2 ]

1 голос
/ 05 марта 2020

Это может быть полезно для вас!

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
1 голос
/ 05 марта 2020

Примерно так должно быть сказано, если номер забронирован в любом направлении:

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?, вы должны знать, что номер забронирован.


Обновлено для удаления room в предложении where на основе комментария OP.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...