Я создаю систему обмена сообщениями и использую 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"