ruby-on-rails 如何使用has_many:trails正确更新React中的User状态,通过::评论关联,删除评论后?

4ktjp1zp  于 2023-08-08  发布在  Ruby
关注(0)|答案(1)|浏览(123)

ERD for my API
Users具有许多reviews,以及许多trailsreviews,反之亦然。
目标:
1.在user配置文件页上,呈现user已审阅过的trails名称列表,但不重复任何trail名称。例如,如果user已多次查看trail,则应仅显示trail名称一次。如果user多次查看trail,并删除其中一个reviews,则列表仍应显示trail名称。如果已删除该trail的所有user'sreviews,则应从呈现列表中删除trail名称。
1.删除review时,更新前端user状态,使user.reviewsuser.trails准确,而无需请求GET
我尝试过的:
user.trails创建一个set唯一的trail名称,然后通过Map它们在JSX中呈现它们

const uniqTrailNames = [...new Set(user.trails.map((trail) => {
  return trail.name
}))]

个字符
这成功地从user审阅过的trails中呈现了trail名称的唯一列表。然而,当一个review被删除时,我正在努力setUser状态正确。
目前,我的handleDelete()函数成功地销毁了数据库中的review,然后调用setUser来更新user.reviewsuser.trails,但这就是我错误地更新trails属性的地方。这种过滤方式会删除所有id匹配review's关联trail_iduser.trails对象,因此即使usertrail的另一个reviewtrail名称也不会呈现,因为trails不再存在于user.trails中。在删除review时,如何只删除一个trail对象,以便user.trails保持准确,如果trail对象基本相同?我是不是走错路了?展示完整的has_manythrough关系是我的项目要求的一部分,所以这就是我迄今为止采用这种方法的原因。

import { useContext } from 'react'
import { UserContext } from '../contexts/UserContext'
import { TrailsContext } from '../contexts/TrailsContext'
import { NavLink } from 'react-router-dom'

function UserTrailReview({ review }) {

    const {user, setUser} = useContext(UserContext)
    const {trails, setTrails} = useContext(TrailsContext)
    const {
        id,
        trail_id,
        trail_rating,
        condition,
        content,
        formatted_date,
        trailname
    } = review

    const trail = trails.find((trail) => {
       return trail.id === trail_id
    })

    function handleDelete() {
        fetch(`/reviews/${id}`, {
            method: "DELETE"
        })
       .then(setUser({
            ...user,
            reviews: user.reviews.filter((review) => {
                return review.id !== id
            }),
            trails: user.trails.filter((trail) => {
                return trail.id !== trail_id
            })
        }))
        .then(() => {
            trail.reviews = trail.reviews.filter((review) => {
                return review.id !== id
            })
            const updatedTrails = trails.map((t) => {
                if (t.id === trail_id) {
                    return trail
                } else {
                    return t
                }
            })
            setTrails(updatedTrails)
        })
    }

xyhw6mcr

xyhw6mcr1#

这就是我的解决方案。
1.从user.reviews中删除评论。
1.检查是否有用户对同一线索的任何其他评论。
1.根据是否存在相同线索的其他评论更新user.trails。
1.设置更新的user.trails。

function handleDelete() {
        fetch(`/reviews/${id}`, {
          method: "DELETE",
        }).then(() => {
          // Remove the review from user.reviews
          const updatedUser = {
            ...user,
            reviews: user.reviews.filter((review) => review.id !== id),
          };
          setUser(updatedUser);
    
          // Check if there are any other reviews of the same trail by the user
          const otherReviewsOfTrail = updatedUser.reviews.some(
            (review) => review.trail_id === trail_id
          );
    
          // Update user.trails based on whether other reviews of the same trail exist
          const updatedTrails = otherReviewsOfTrail
            ? user.trails
            : user.trails.filter((trail) => trail.id !== trail_id);
    
          // Set the updated user.trails
          setUser((user) => ({
            ...user,
            trails: updatedTrails,
          }));
        });
      }

字符串

相关问题