在我的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
之类的课程 - 换句话说,你确信你正在寻找独特的东西。这可能并不重要,但是搜索一个集合然后从中获取第一个对象会感到浪费和错误。
有更好的方法吗?
我环顾四周,这是最接近的,但是(我不认为)真的覆盖它。 How to display unique records from a has_many through relationship?
答案 0 :(得分:5)
实际上非常简单:
attendance = Attendance.find_by(user_id: @user.id, event_id: this_event_id)
您只需将相同的条件传递给find_by
,它会返回第一条记录。
虽然有一个问题。使用find_by
,如果找不到任何内容,您将获得nil。如果您需要引发ActiveRecord::RecordNotFound
,如果找不到任何内容,则可以使用find_by!
。
答案 1 :(得分: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)
答案 2 :(得分:2)
试试这个:
Attendance.find_by_user_and_event(@user.id, this_event_id)
如果未找到记录,则返回nil
。如果你想提出异常
Attendance.find_by_user_and_event!(@user.id, this_event_id)