Rails — Как создать несколько «совпадений» за одно действие между пользователем и возможностями?

Я ищу самый простой и самый умный способ создать интерес_ид (совпадение) в один клик.

Вот мой MVC:

пользователь.rb

class User < ApplicationRecord
  has_many :interests, through: :opportunities
end

проценты.рб

class Interest < ApplicationRecord
  belongs_to :opportunity
  belongs_to :user
end

возможность.rb

class Opportunity < ApplicationRecord
  has_many :interests
end

ИнтересыController.rb

def create
  @user = current_user
  @opportunities = Opportunity.all
  @interest = Interest.new(interest_params)
  if @interest.save!
    redirect_to user_interests_path, notice: 'it works'
  else
    render :new, notice:"it doesn't work"
  end
end

def interest_params
  params.permit(
    :user_id,
    :opportunity_id)
end

пользователь/шоу

<%= link_to "Match", user_interests_path(@user), class:"btn btn-primary", :method => :post %>

На данный момент я не могу упустить возможности (ноль). Не могли бы вы посоветовать мне самый простой способ создать интересы? (Новинка на RoR за 6 месяцев). Большое спасибо за вашу помощь.

Почему вы хотите использовать ссылку вместо формы с флажками?

MrShemek 08.03.2019 17:17

Как Interest может иметь opportunity_ids, если оно принадлежит (одному) Opportunity?

Sovalina 08.03.2019 17:19

В срок я хотел бы автоматически генерировать проценты при обратных вызовах. Точно для возможного_идентификатора, я редактирую.

Maceoz 08.03.2019 17:30
Стоит ли изучать PHP в 2026-2027 годах?
Стоит ли изучать PHP в 2026-2027 годах?
Привет всем, сегодня я хочу высказать свои соображения по поводу вопроса, который я уже много раз получал в своем сообществе: "Стоит ли изучать PHP в...
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
В JavaScript одним из самых запутанных понятий является поведение ключевого слова "this" в стрелочной и обычной функциях.
Приемы CSS-макетирования - floats и Flexbox
Приемы CSS-макетирования - floats и Flexbox
Здравствуйте, друзья-студенты! Готовы совершенствовать свои навыки веб-дизайна? Сегодня в нашем путешествии мы рассмотрим приемы CSS-верстки - в...
Тестирование функциональных ngrx-эффектов в Angular 16 с помощью Jest
В системе управления состояниями ngrx, совместимой с Angular 16, появились функциональные эффекты. Это здорово и делает код определенно легче для...
Концепция локализации и ее применение в приложениях React ⚡️
Концепция локализации и ее применение в приложениях React ⚡️
Локализация - это процесс адаптации приложения к различным языкам и культурным требованиям. Это позволяет пользователям получить опыт, соответствующий...
Пользовательский скаляр GraphQL
Пользовательский скаляр GraphQL
Листовые узлы системы типов GraphQL называются скалярами. Достигнув скалярного типа, невозможно спуститься дальше по иерархии типов. Скалярный тип...
1
3
70
2

Ответы 2

Если я правильно понимаю вашу схему отношений, Interest — это запись соединения, связывающая User с (в конечном итоге) многими Opportunity и наоборот (отношение «многие ко многим»).

С учетом сказанного (и, пожалуйста, поправьте меня, если я ошибаюсь), вы можете сделать следующее, чтобы достичь того, чего хотите:

# in user/show
<% @opportunities.each do |opportunity| %>
  <%= 
    link_to "Match opportunity #{opportunity.id}",
      user_interests_path(@user, opportunity_id: opportunity.id),
      class: "btn btn-primary",
      method: :post
  %>
<% end %>

# in interests_controller
def create
  if current_user.interests.create(opportunity_id: opportunity_id_param)
    redirect_to user_interests_path, notice: 'it works'
  else
    render :new, notice: "it doesn't work"
  end
end

private

def opportunity_id_param
  params.require(:opportunity_id)
end

Этот предлагаемый код:

  • требуется параметр opportunity_id для действия interests#create
  • используйте current_user для автоматической установки user_id в модели Interest, чтобы конечные пользователи не могли отправлять user_id, которые им не принадлежат (если бы они могли, то каждый пользователь мог бы вызвать интерес у других пользователей без их согласия... уязвимость в безопасности)

Кстати, Я настоятельно рекомендую вам не выбирать все существующая Opportunity запись и отображение ее на вашей странице: она не масштабируется. Когда-нибудь вы получите сотни Opportunity записей, что сделает этот список слишком большим с точки зрения взаимодействия с пользователем.

Я предлагаю более разумный подход, например, какой-то порядок + ограничение: максимум 10 записей, упорядоченных по «наибольшему интересу», что может быть достигнуто следующим образом:

# in controller
@popular_opportunities = Opportunity
  .joins('LEFT JOINS interests ON interests.opportunity_id = opportunities.id')
  .order('count(interests.*) DESC, opportunities.id')
  .limit(10)

А затем в представлении просто используйте @populator_opportunities вместо @opportunities.

Другие варианты, такие как разбиение на страницы, также эффективны в этом случае, но порядок, соответствующий ИМО, является минимальным.

Точный. Кажется, это работает. У меня есть только неопределенный метод «выборки» для строки, которая только что появилась при нажатии, но сгенерировала хорошее количество кнопок.

Maceoz 08.03.2019 17:47

@Maceoz Я обновил свой ответ фиксированным кодом. Я не ожидал, что ActionController::Parameters.new(a: 1).require(:a) вернет значение, а копию хеша только с разрешенными/обязательными парами ключ/значение.

MrYoshiji 08.03.2019 18:02

Спасибо ! Я уже в пути, теперь вижу возможность_id в параметрах. Появилась другая ошибка, но из-за моих вложенных ассоциаций (HasManyThroughNestedAssociations). Вероятно, проблема в моих моделях (has_many, как предложил Алан).

Maceoz 08.03.2019 18:22

@Maceoz да, Userhas_many :interests и поэтому тоже has_many :opportunities, through: :interests

MrYoshiji 08.03.2019 18:47

Во-первых, вам нужно каким-то образом передать идентификаторы возможностей, которые вы хотите вызвать интерес, лучше всего — это форма с флажками, как сказал MrShemek, или раскрывающийся список с несколькими вариантами выбора.

Я думаю, вы, вероятно, допустили некоторые ошибки в User and Opportunity с частями has_many и own_to:

class User < ApplicationRecord
   has_many :interests
   has_many :opportunities, through: :interests
   # interest is the one that links user and opportunity, it has the references for both user and opportunities
end
class Opportunity < ApplicationRecord
   has_many :interests
   has_many :users, through: :interests
 end

то в контроллере вы можете сделать

def create
   @user = current_user
   @opportunities = Opportunity.all
   @user.opportunity_ids = interest_params[:opportunity_ids] # it will create the interrests automatically for the given ids (because the relations of has_many through)
   if @user.save!
      redirect_to user_interests_path, notice: 'it works'
   else
      render :new, notice:"it doesn't work"
   end
end

авторы ids опасны. они имеют эффект сохраняемости: User.first.opportunity_ids = [] фактически запускают DELETE операторы, даже не выполняя проверки или обратные вызовы, и все равно делают это, даже если вы не save пользовательский объект. Да, это безумие, я знаю... Не используйте _ids сгенерированные методы при обновлении (потому что они правильно работают при создании)

MrYoshiji 08.03.2019 17:55

Другие вопросы по теме