通过关系在has_many中找到唯一记录的更好方法

RAD*_*Dan 4 ruby activerecord ruby-on-rails

在我的rails应用程序中,用户可以参加活动 -

user.rb

has_many :attendances
has_many :events, through: :attendances
Run Code Online (Sandbox Code Playgroud)

event.rb

has_many :attendances
has_many :users, through: :attendances
Run Code Online (Sandbox Code Playgroud)

...有一个由event_id,user_id和其他一些零碎组成的考勤表 -

attendance.rb

belongs_to :user
belongs_to :writers_event
Run Code Online (Sandbox Code Playgroud)

在寻找特定的出勤时,我发现自己正在使用.where ... .first - 例如

attendance = Attendance.where(user_id: @user.id, event_id: this_event_id).first
Run Code Online (Sandbox Code Playgroud)

让我感到震惊的是,我错过了课堂,我们谈到了find_by在这种情况下使用的东西- 换句话说,你确信你正在寻找独特的东西.这可能没关系,但是搜索一个集合然后从中获取第一个对象会感到浪费和错误.

有没有更好的办法?

我环顾四周,这是最接近的,但不(我认为)真的覆盖它.如何通过has_many关系显示唯一记录?

Yur*_*dev 5

它实际上非常简单:

attendance = Attendance.find_by(user_id: @user.id, event_id: this_event_id)
Run Code Online (Sandbox Code Playgroud)

你只需传递相同的条件find_by,它就会返回第一条记录.

虽然有一个问题.通过使用find_by,如果没有找到,你将得到零.如果你需要一个ActiveRecord::RecordNotFound凸起,如果没有找到,你可以使用find_by!.