了解Rails ActveRecord关联:调用结果的类方法

时间:2017-05-20 17:26:45

标签: ruby-on-rails activerecord

我有一个使用我想要了解的has_many_through关联的示例。

假设有一些类(ActiveRecord::BaseMovieTheater的子类以及第三类Showing来记录它们之间的关联(电影显示哪些剧院)。 Showing的实施是

class Showing < ActiveRecord::Base
   def self.movies
     Movie.where( id: pluck(:movie_id) )
   end

   def self.theaters
     Theater.where( id: pluck(:theater_id) )
   end
end

班级Movie

class Movie < ActiveRecord::Base
    def showings
        Showing.where(movie_id: id)
    end

    def theaters
        showings.theaters
    end
end

这有效,但我不明白为什么。 theaters是类Showing上的类方法,它返回显示在某处的所有影院。 showings是一个实例方法,因此如果movie属于类Movie,则movie.showings应返回一组类Showing的对象。那么编写以下内容有什么意义呢?

movie.showings.theaters

当我试用它时,它会正确地返回那些影片正在显示的影院,但由于theaters是一个类方法,如何在movies.showings返回的内容上调用它是有意义的?

1 个答案:

答案 0 :(得分:1)

movie.showings返回Showing个对象的ActiveRecord集合。您编写的类方法(如self.theaters)可以由Showing个对象的任何ActiveRecord关系调用。 Showing.theatersmovie.showings.theaters类似,但在第二个示例中,Showing个对象的范围仅限于与给定movie有关联的对象。

考虑ActiveRecord类方法的另一种方法是它们对记录集合进行操作,而实例方法对单个记录进行操作。