1

I had the following function. It worked, but I don't like the way it looked.

# in user.rb
def awarded_requests
  Request.joins('JOIN application ON application.request_id = request.id').where('accepted = true AND application.user_id = ?', self.id)
end

Then I refactored it to something that's clearly an improvement, but probably not simplest possible form:

def awarded_requests
  Request.find(self.applications.accepted.map(&:request_id))
end

Can this be simplified further?

4

1 に答える 1

1

多くの関係を設定する場合は、スコープをマージすることでそれらのリクエストを除外できます。

class User
  has_many :applications

  def awarded_requests
    Request.joins(:applications).merge(applications.accepted)
  end
end

applications.acceptedはレコードの配列ではなくスコープであることに注意してください。これは、Active Record が内部的に SQL クエリの一部を表す方法であるため、それらのいくつかをスマートに組み合わせることができます。

于 2012-09-15T15:25:29.860 に答える