在has_many through关系中查找唯一记录的更好方法

4
在我的Rails应用中,用户可以参加活动 - user.rb
has_many :attendances
has_many :events, through: :attendances

event.rb

has_many :attendances
has_many :users, through: :attendances

...带有出席表,由event_id、user_id和其他一些细节组成 -

attendance.rb

belongs_to :user
belongs_to :writers_event

在寻找特定的考勤记录时,我发现自己通常使用.where ... .first - 例如:

attendance = Attendance.where(user_id: @user.id, event_id: this_event_id).first

我想到了自己错过了一堂课,这堂课讲解如何在类似情况下使用像find_by这样的东西——换句话说,当您确信正在查找某个唯一的东西时。也许这并不重要,但是从集合中搜索然后取第一个对象感觉很浪费和错误。
有更好的方法吗?
我看了看,这是最接近的,但不太符合需求(我认为)。 如何显示has_many through关系中的唯一记录?
3个回答

5

实际上,这很简单:

attendance = Attendance.find_by(user_id: @user.id, event_id: this_event_id)

您只需将相同的条件传递给find_by,它就会返回您第一条记录。
然而,有一个注意点。使用find_by,如果什么都没有找到,您会得到nil。如果需要在找不到任何内容时引发ActiveRecord :: RecordNotFound,则可以使用find_by!

记住 find_by 方法对于 nil 和异常的处理非常重要,因为它可能会出现问题。 - A Fader Darkly

3
您可以使用find_by来完成这个操作:
attendance = Attendance.find_by(user_id: @user.id, event_id: this_event_id)

虽然在幕后,它正在执行查找并获取第一个结果。

然而,在这里,您可以从Rails获得更多帮助:

current_user.attendances.find_by(event_id: this_event_id)

1
显然,您可以对事件执行相同的操作:my_cool_event.attendances.find_by(user_id: @user.id) - A Fader Darkly

2
尝试这个:
Attendance.find_by_user_and_event(@user.id, this_event_id)

如果记录未找到,则返回nil。如果你想引发异常。
Attendance.find_by_user_and_event!(@user.id, this_event_id)

根据升级到Rails 4.0的说明,“除了find_by_...和find_by_...!之外,所有动态方法都已被弃用”。 - Kh Ammad
如果你喜欢我的回答,请点赞 ;) - Kh Ammad

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接