ruby-on-rails (Rails)如何在Rails中从一个嵌套的表单插入创建友谊的双方?

elcex8rz  于 2023-10-21  发布在  Ruby
关注(0)|答案(1)|浏览(115)

基本上,我有一个用户模型,和一个友谊连接表,使用户彼此的朋友。

class User < ApplicationRecord
  has_many :friendships
  has_many :friends, through: :friendships, class_name: 'User'
class Friendship < ApplicationRecord
  belongs_to :user
  belongs_to :friend, class_name: 'User'

很简单,对吧?现在,我为每个用户的编辑页面提供了一个集合复选框,以确定谁是他们的朋友:

<%= f.collection_check_boxes( :friend_ids, @other_users, :id, :full_name) do |b| %>
  <%= b.label(class:"form-check-label") { b.check_box(class: 'form-check') + b.text } %>
<% end %>

当我在Timmy的编辑页面上检查John时,我想创建两个连接表,一个将User(Timmy)链接到Friend(John),另一个将Friend链接到User。目前,只有一个表正在创建:

Friendship Create (0.7ms)  INSERT INTO `friendships` (`user_id`, `friend_id`, `created_at`, `updated_at`) VALUES (48, 49, '2023-09-21 14:24:36', '2023-09-21 14:24:36')

我尝试在友谊模型中添加回调

after_create do |ship|
    friend_friendship = Friendship.create(user_id: ship.friend_id, friend_id: ship.user_id)
  end

但显然失败了,形成了一个死循环!
我如何创建朋友到用户的连接没有大惊小怪?谢谢

ecfsfe2w

ecfsfe2w1#

accept_nested_attributes是一个可以实现这个功能的东西。您还需要创建一个连接模型。
让我们看一个例子,以了解基本的-

#==== 3 model associations here===
class User < ActiveRecord::Base
  has_many :friends
  accepts_nested_attributes_for :friends
  has_many :friendships, through: :friends
end

class Friend < ActiveRecord::Base
  belongs_to :users
  belongs_to :Friendship
end

class Friendship < ActiveRecord::Base
  has_many :friends
  has_many :users, through: :lines
end

#===== View ====== 
<%= nested_form_for @user do |f| %>
...#user attributes
<%= f.fields_for :friends do |friend| %>
<%= friend.label :name %>
<%= friend.collection_select(:friendship_id, Friendship.all, :id, :name , {include_blank: 'Select friends'} ) %>

关联类Friend将通过友谊_id和user_id加入用户和友谊:

相关问题