按独特的子协会分组
Grouping by unique child associations
我想根据子关联对父对象进行分组。我正在努力描述这一点,所以我将跳入示例。
假设我们要根据其中包含的 Actors
的独特组对 Films
进行分组。一个Actor可以在多个group中,但是actors的group是group唯一的。
示例:
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 A
和 Film C
组合在一起,Film D
和 Film E
组合在一起,而 Film B
和Film F
将单独分组。
如果我用属性来做这件事,我会使用 Film.where(actor_id: id).first_or_initialize
,但是这个特殊问题需要它与 dynamic 数量的 child 一起工作associations,所以我不确定该怎么做。
我最后的解决方案其实很简单,但不是那么优雅。我存储了子关联 (Actors
) 的唯一排序数组的字符串格式,并将其用于 find_or_initialize
组。
我正在使用 nested attributes
将演员保存在 attributes
数组中,我发现它更快一点,因为它使用 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}])
我确定有更好的方法.. 但这个有效。
我想根据子关联对父对象进行分组。我正在努力描述这一点,所以我将跳入示例。
假设我们要根据其中包含的 Actors
的独特组对 Films
进行分组。一个Actor可以在多个group中,但是actors的group是group唯一的。
示例:
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 A
和 Film C
组合在一起,Film D
和 Film E
组合在一起,而 Film B
和Film F
将单独分组。
如果我用属性来做这件事,我会使用 Film.where(actor_id: id).first_or_initialize
,但是这个特殊问题需要它与 dynamic 数量的 child 一起工作associations,所以我不确定该怎么做。
我最后的解决方案其实很简单,但不是那么优雅。我存储了子关联 (Actors
) 的唯一排序数组的字符串格式,并将其用于 find_or_initialize
组。
我正在使用 nested attributes
将演员保存在 attributes
数组中,我发现它更快一点,因为它使用 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}])
我确定有更好的方法.. 但这个有效。