一种更优雅的方式来进行 activerecord 关联
A more elegant way to do activerecord associations
大家好,我正在 Ruby Rails 上学习,我目前正在做一个活动应用程序,用户可以在其中创建活动并可以注册其他人的活动。
基本内容,但我意识到当用户创建活动时,他不会自动添加到参加列表中。不是我想的那么简单
基础知识是我通过一个名为 Goings 的 table 在用户和事件之间建立了多对多关系。它工作得很好,我可以得到
User.attended_events
Event.atendees
获取ActiveRecord关系。
当我在事件控制器中创建事件时,我将事件构建为
@user.events.build(description: event[:description], date: date_from_date_select_params(event, :date))
date_from_date_select 是将日期构建到日期时间对象中的助手。
所以当我执行 @user.save 时,对象已创建但我不知道它有什么 ID 或类似的东西我只知道它可能是用户创建的最后一个,所以我想得到对象的唯一方法是使用 created_at 但因为我的 default_scope 是(订单日期::desc)并且日期是用户给定的我不知道该怎么做
Event.where(user_id: @user.id).map{|event| @user.attended_events<<event if event.atendees.none?}
上面的这段代码工作得很好。我获得了用户事件,并且仅在没有与会者(事件是新事件)的情况下将其附加到用户参加的事件中。
问题是我觉得我只是写了一些意大利面条式的代码,并且感觉有更优雅的方法可以解决这个问题。我想学习
build
方法会 return 新初始化的记录给你,所以你可以尝试像这样将它添加到集合中,而不是重新获取它
# build a new event and store it in a variable
new_event = @user.events.build(description: event[:description], date: date_from_date_select_params(event, :date))
# save the event record directly
new_event.save
# append the new event to the "attended_events" collection
@user.attended_events << new_event
大家好,我正在 Ruby Rails 上学习,我目前正在做一个活动应用程序,用户可以在其中创建活动并可以注册其他人的活动。
基本内容,但我意识到当用户创建活动时,他不会自动添加到参加列表中。不是我想的那么简单
基础知识是我通过一个名为 Goings 的 table 在用户和事件之间建立了多对多关系。它工作得很好,我可以得到
User.attended_events
Event.atendees
获取ActiveRecord关系。
当我在事件控制器中创建事件时,我将事件构建为
@user.events.build(description: event[:description], date: date_from_date_select_params(event, :date))
date_from_date_select 是将日期构建到日期时间对象中的助手。
所以当我执行 @user.save 时,对象已创建但我不知道它有什么 ID 或类似的东西我只知道它可能是用户创建的最后一个,所以我想得到对象的唯一方法是使用 created_at 但因为我的 default_scope 是(订单日期::desc)并且日期是用户给定的我不知道该怎么做
Event.where(user_id: @user.id).map{|event| @user.attended_events<<event if event.atendees.none?}
上面的这段代码工作得很好。我获得了用户事件,并且仅在没有与会者(事件是新事件)的情况下将其附加到用户参加的事件中。
问题是我觉得我只是写了一些意大利面条式的代码,并且感觉有更优雅的方法可以解决这个问题。我想学习
build
方法会 return 新初始化的记录给你,所以你可以尝试像这样将它添加到集合中,而不是重新获取它
# build a new event and store it in a variable
new_event = @user.events.build(description: event[:description], date: date_from_date_select_params(event, :date))
# save the event record directly
new_event.save
# append the new event to the "attended_events" collection
@user.attended_events << new_event