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

时间:2015-11-20 10:59:47

标签: ruby-on-rails ruby activerecord

在我的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?

3 个答案:

答案 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)