具有动态范围的 ActiveRecord has_one

vin*_*boy 1 activerecord ruby-on-rails

我有这个

class Student
  has_many :assignments
end

class Assignment
  belongs_to :student
  belongs_to :book
end

class Book
  has_many :assignments
end
Run Code Online (Sandbox Code Playgroud)

为了找到学生的“哈利波特”作业,我这样做

@student.assignments.find_by_book_id(Book.find_by_name('Harry Potter'))
Run Code Online (Sandbox Code Playgroud)

有没有办法让它成为Student模型的 has_one 关联?

像这样的东西(这里是伪代码)

class Student
  has_many :assignments
  has_one  :harry_potter_assigment, -> { where book_id: Book.find_by_name('Harry Potter') }, class: 'Assignment'
end
Run Code Online (Sandbox Code Playgroud)

如果没有,有has_one什么更好的方法?

Pav*_*van 5

如果我没有错,以下应该有效

#student.rb
class Student
  has_many :assignments
  has_one :harry_potter_assigment, -> { where(book_id: Book.find_by_name('Harry Potter').id }, class_name: "Assignment"
end
Run Code Online (Sandbox Code Playgroud)