Сначала я хочу представить вас, потому что мне кажется, что мне не хватает какой-то базовой концепции Golang.
В моем приложении многие модели будут иметь метод с именем GetByUserId. Я создал интерфейс (UserCreatedEntity), который требует этот метод, поэтому я смогу создать фабрику методов контроллера GetUserRecords для каждого типа записей с помощью:
router.Handle("/ideas/mine",
middlewares.AuthUser(controllers.GetMineFactory(&models.Idea{}))).Methods("POST")
router.Handle("/votes/mine",
middlewares.AuthUser(controllers.GetMineFactory(&models.Vote{}))).Methods("POST")
router.Handle("/someNewType/mine",
middlewares.AuthUser(controllers.GetMineFactory(&models.SomeNewType{}))).Methods("POST")
Вот так выглядит мой интерфейс:
type UserCreatedEntity interface {
GetByUserId(userId uint) []UserCreatedEntity
}
И реализация:
func (idea *Idea) GetByUserId(userId uint) []UserCreatedEntity {
ideas := []Idea{}
GetDB().
Table("ideas").
/** Query removed to make code less confusing **/
Scan(ideas)
return ideas
}
Очевидно, что это не работает (версия со срезом указателей тоже не работает). Дело в том, что этот код будет работать, если я верну только одну запись - вот так (очевидно, с изменением подписи в интерфейсе):
func (idea *Idea) GetByUserId(userId uint) UserCreatedEntity {
idea := &Idea{}
GetDB().
Table("ideas").
/** Query removed to make code less confusing **/
First(idea)
return idea
}
Как сделать так, чтобы он работал как срез? Как я уже сказал, я подозреваю, что мне не хватает некоторых важных знаний. Такое глубокое объяснение было бы потрясающим.
Решение:
func (idea *Idea) GetByUserId(userId uint) []UserCreatedEntity {
ideas := []*Idea{}
GetDB().
Table("ideas").
Select("problems.name AS problem_name, ideas.id, ideas.problem_id, ideas.action_description, ideas.results_description, ideas.money_price, ideas.time_price, ideas.is_published").
Joins("INNER JOIN problems ON ideas.problem_id = problems.id").
Where("ideas.user_id = ?", userId).
Scan(&ideas)
uces := make([]UserCreatedEntity, len(ideas))
for i, idea := range ideas {
uces[i] = idea
}
return uces
}