Lógica de negocios:
El dueño de la solicitud de servicio (lo llamaré el Cliente) ve todas las ofertas que existen en la solicitud de servicio. Estas ofertas se muestras en la acción show del service request controller, en esa vista tienes que agregar un botón que diga "Aceptar Oferta" o lo que tu considerés, este botón sólo lo puede ver el dueño de la solicitud del servicio. El botón "aceptar" manda al service_arrangement_controller en la acción de new. (Está vista sólo puede ser accedida por el cliente).
En esta vista muestras la persona que seleccionó como servidor, así también puedes agregar la fecha de inicio y la fecha de término de la solicitud de servicio y en un campo oculto poner el id del service_request, todos estos campos son obligatorios por último la vista tiene un botón que dice "Crear Acuerdo", este será el botón submit que hará una petición POST hacia el service_arrangement_controller.rb en la acción create, sólo el dueño puede hacer peticiones POST a esa acción en caso de que se detecte que no sea el dueño, vas a redirigir a root_ur.
En caso de que la petición POST no tenga todos los campos rebotas y renderizas :new. En caso de que la petición sea correcta entonces creas un nuevo service_arrangement con los 5 campos obligatorios (server_id, client_id, start_date, end_date, service_request_id).
Cuando se cree exitósamente un service arrengement, el service requests debes cambiarlo a estado closed. Cuando todo sea exitoso ahora rediriges a service_arrangement show (sí tambíen debes crear esta vista)
Hay un pequeño gran problema en diseño, que no voy a corregir, así que en algún lugar de tu código tendrás que haces esto.
def create
service_request = ServiceRequest.find params[:service_request_id]
arrengement = ServiceArrangement.new service_arrangement_params
arrengement.service = service_request.service.dup //Aquí esta la magia que es por falla del diseño
end
Y por si fuera poco además debes enviar la notificación del usuario cuando el service_arrangement se haya creado correctamente, debes agregar estas dos líneas (muy probablemente las tengas que modificar) antes de que el controlador create redirecciones
@service_arrangement.create_activity action: 'accepted_offer', recipient: server, owner: current_user
send_notification server.id, 'accepted_offer'
Esas dos crean la notificación y la envian
Tienes que programar esto usando Single Responsability (Checar la carpeta service_request en el modelo ) si no lo haces, te vas a super pelear con Rails.
Validaciones del Modelo
Cuando crees un nuevo service_arrangement debes validar
que sí tenga un server, un client, un start_date, un end_date y un service.
AQUI NO SUCEDIO NADA XDD