由独特的儿童协会分组

时间:2015-04-17 15:42:45

标签: ruby-on-rails ruby postgresql ruby-on-rails-4 grouping

我想根据子关联对父对象进行分组。我很难描述这个,所以我会跳到这个例子中。

假设我们希望按其中的唯一Films组对Actors进行分组。一个Actor可以在多个组中,但该组actor对于该组是唯一的。

示例:

Film A
    Actor with id 34
    Actor with id 45

Film B
    Actor with id 45

Film C
    Actor with id 34
    Actor with id 45

Film D
    Actor with id 34
    Actor with id 45
    Actor with id 21

Film E
    Actor with id 34
    Actor with id 45
    Actor with id 21

Film F
    Actor with id 34

在示例中,我希望将Film AFilm C组合在一起,Film DFilm E组合在一起,而Film B和{{ 1}}将在他们自己的组中单独分组。

如果我使用属性执行此操作,我会使用Film F,但是这个特殊问题要求它使用动态数量的子关联,所以我不确定该怎么做。

1 个答案:

答案 0 :(得分:0)

我的最终解决方案实际上很简单,但并不那么优雅。我存储了子关联(Actors)的唯一排序数组的字符串格式,并将其用于find_or_initialize组。

我使用nested attributes来保存attributes数组中的actor,我发现它更快一点,因为它使用INSERT INTO

film = Film.find(some_id)     
actor_ids = film.actors.map {|a| a.id}.sort.uniq
attributes = []
for id in actor_ids
  attributes << {actor_id: id}
end
film_group = FilmGroup.where(actor_array: actor_ids.to_s).first_or_initialize
film_group.update(actor_count: actor_ids.count, actors_attributes: attributes, films_attributes: [{film_id: film.id}])

我确定有更好的方法......但这样做有效。