一种更优雅的方式来执行activerecord关联

时间:2016-04-07 23:24:53

标签: ruby-on-rails activerecord associations

大家好,我正在学习Ruby on Rails,而且我目前正在做一个事件应用程序,用户可以创建事件并注册其他人的活动。

基本的东西,但我意识到当用户创建一个事件时,他没有自动添加到有人照片列表中。我想的并不是那么简单。

基础知识是通过名为Goings的表在User和Event之间建立了多对多的关系。它工作得很好,我可以得到

User.attended_events
Event.atendees

获取ActiveRecord关系。

当我在Events控制器中创建一个事件时,我将事件构建为

@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?} 

上面的代码完美无缺。我收到了用户事件,只有在没有参加者(事件是新的)时才将其附加到用户参加的事件中。

问题是我觉得我刚刚写了一些意大利面条代码,觉得那里有更优雅的解决方法。我正在学习

1 个答案:

答案 0 :(得分:1)

build方法会将新初始化的记录返回给您,因此您可以尝试将其添加到集合中,而不是重新获取它

# 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
相关问题