Примем следующие соотношения:Как высушить Rails/ActiveRecord при использовании as_json?
Blog
HAS_MANY Posts
has_many Comments
has_one Author
Если я хочу, чтобы получить все Blogs
со всеми Posts
, я мог бы написать:
Blog.all.as_json(:include => :posts)
Однако это приведет к N + 1 запрос.
Поэтому вместо того, мне нужно написать:
Blog.includes(:posts).all.as_json(:include => :posts)
Который работает, как ожидалось, но не очень DRY, особенно если у вас есть вложенные включает.
Например:
Blog.includes(
:posts => {
:comments => :author
}
).all.as_json(
:include => {
:posts => {
:include => {
:comments => {
:include => :author
}
}
}
}
)
Эта проблема становится еще хуже, когда мне нужно запросить для этого же формата JSON в нескольких местах.
Я думал о вводе формата as_json
отношений в методе класса, как так:
class Blog < ActiveRecord::base
...
def self.include_all_json_format
:include => {
:posts => {
:include => {
:comments => {
:include => :author
}
}
}
}
end
...
end
который решает проблему запросов для этого формата JSON в нескольких местах, потому что я могу затем просто использовать:
Blog.includes(
:posts => {
:comments => :author
}
).all.as_json(
Blog.include_all_json_format
)
Но, конечно же, Blog.includes()
принимает другой формат для его хэш отношений, так это:
Blog.includes(
Blog.include_all_json_format
).all.as_json(
Blog.include_all_json_format
)
Не сработает.
Я мог бы поставить хэш отношения Blog.includes()
во втором методе класса, но наличие двух методов, объявляющих то же самое, включает структуру не DRY.
Единственная идея, которую я могу думать прямо сейчас, используя Blog.include_all_json_format
метод, упомянутый выше, а затем писать метод преобразователя, который может превратить что отношения хэш в формат, ожидаемый Blog.includes()
(по сути просто зачистки из :include
ключей), так что можно было бы назвать:
Blog.includes(
MyConverter(Blog.include_all_json_format)
).all.as_json(
Blog.include_all_json_format
)
Но тогда это становится сложнее, когда я хочу использовать :only
или :except
в моем формате as_json
.
Как я могу сушить, они включают в себя, желательно только объявление формата отношений один раз?
Возможно, есть какой-то способ использования названных областей или некоторых драгоценных камней?
Любая помощь очень ценится.
Вы можете попробовать [deep_pluck] (https://github.com/khiav223577/deep_pluck), чтобы высушить его. –