Я ищу самый простой и самый умный способ создать интерес_ид (совпадение) в один клик.
Вот мой 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 месяцев). Большое спасибо за вашу помощь.
Как Interest может иметь opportunity_ids, если оно принадлежит (одному) Opportunity?
В срок я хотел бы автоматически генерировать проценты при обратных вызовах. Точно для возможного_идентификатора, я редактирую.





Если я правильно понимаю вашу схему отношений, 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#createcurrent_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 Я обновил свой ответ фиксированным кодом. Я не ожидал, что ActionController::Parameters.new(a: 1).require(:a) вернет значение, а копию хеша только с разрешенными/обязательными парами ключ/значение.
Спасибо ! Я уже в пути, теперь вижу возможность_id в параметрах. Появилась другая ошибка, но из-за моих вложенных ассоциаций (HasManyThroughNestedAssociations). Вероятно, проблема в моих моделях (has_many, как предложил Алан).
@Maceoz да, Userhas_many :interests и поэтому тоже has_many :opportunities, through: :interests
Во-первых, вам нужно каким-то образом передать идентификаторы возможностей, которые вы хотите вызвать интерес, лучше всего — это форма с флажками, как сказал 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 сгенерированные методы при обновлении (потому что они правильно работают при создании)
Почему вы хотите использовать ссылку вместо формы с флажками?