Просто несколько быстрых правил для начала.
У пользователя много комментариев, это будет связь между пользователем и комментарием, который он оставил. У вас уже есть это
У пользователя много комментариев в профиле, это связь между пользователем и комментариями, оставленными для этого пользователя в его профиле
Теперь у вас есть это различие, которое начинает проясняться.
Начните с создания единой таблицы внешних ссылок, которая будет go между пользователями и комментариями, оставленными для профиля, и вызовом it profile_comments
этой profile_comments
таблице требуются user_id
и comment_id
целого типа для хранения первичных ключей из таблиц пользователей и комментариев, где user_id
- это идентификатор пользователя, у которого оставлен комментарий о них в их профиле
Теперь вы можете настроить модель profile_comment
со следующими отношениями
belongs_to comment
belongs_to user
Итак, теперь вам нужно изменить отношения вашей модели пользователя на следующие
user.rb
has_many :comments
has_many :profile_comments, dependent: :destroy
comment.rb
belongs_to :user #not users as you have defined in your question
has_many :profile_comments, dependent: :destroy
, а новой модели profile_comment.rb
нужны два предложения belongs_to
для комментария и user
profile_comment.rb
belongs_to :user
belongs_to :comment
Теперь, когда вы создаете комментарий, который необходимо назначить пользователю, а также profile_comment
Итак, теперь ваш контроллер комментариев должен настроить эти отношения, чтобы вместо
before_action :find_comment ,only:[:show,:update,:edit,:destroy]
def new
@user =User.find(params[:id])
@comment = @user.comments.build
end
def create
@user =User.find(params[:id])
@comment = @user.comments.build(comment_params)
@comment.user = current_user
if @comment.save
redirect_to doctor_path(:id => @user.id)
end
end
Вам нужно что-то вроде этого
def create
@user =User.find(params[:id])
@comment = current_user.comments.build(comment_params)
@profile_comment = ProfileComment.new
@user.profile_comment < @profile_comment
@comment.profile_comment < @profile_comment
if @comment.save
redirect_to doctor_path(:id => @user.id)
end
end
Ваше действие обновления также должно измениться соответствующим образом
Теперь в вашем представлении вместо
<% for item in @user.comments %>
<% if item.text.present? %>
<%= item.text %><br>
<%= @comment.user.name %>
<br><hr>
<% end %>
<% end %>
Вы хотите это немного сложно, потому что вам нужно перейти от комментария профиля к комментарию, а затем к пользователю, который создал комментарий
<% @user.profile_comments.each do | profile_comment |%>
<%comment = profile_comment.comment%>
<% if comment.text.present? %>
<%= comment.text %><br>
<%if comment.user.blank?%>
No user assigned to this comment
<%else%>
<%= comment.user.name #or email or whatever%>
<%end%>
<br><hr>
<% end %>
<% end %>
Хотя текст является зарезервированным словом и является фактическим типом столбца, поэтому вы можете хотите изменить текст имени столбца на что-то другое
Любые вопросы по этому поводу не стесняйтесь возвращаться ко мне, но меня не будет в ближайшие 24 часа. Надеюсь, это ясно и поможет вам понять, что пошло не так с вашей начальной настройкой
В контроллере и представлении я предположил, что current_user
- это человек, делающий комментарий, а @user
- это человек, который комментируется. Просто переключи этот раунд, если я ошибаюсь