我有一个使用我想要了解的has_many_through
关联的示例。
假设有一些类(ActiveRecord::Base
)Movie
和Theater
的子类以及第三类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
返回的内容上调用它是有意义的?
答案 0 :(得分:1)
movie.showings
返回Showing
个对象的ActiveRecord集合。您编写的类方法(如self.theaters
)可以由Showing
个对象的任何ActiveRecord关系调用。 Showing.theaters
与movie.showings.theaters
类似,但在第二个示例中,Showing
个对象的范围仅限于与给定movie
有关联的对象。
考虑ActiveRecord类方法的另一种方法是它们对记录集合进行操作,而实例方法对单个记录进行操作。