2016-05-14 1 views
-1

Таблицы базы данных, первая таблица содержит теги (id, name), вторая таблица содержит отношение между элементами и тегами.Как создать ActionController для получения элементов со списком тегов

tags   
     id name  
     1 TagA 
     2 TagB 
     3 TagC 


tags_items  
     item_id tag_id 
      1   1 
      1   2 
      1   3 
      2   1 
      2   3 

Активные reocrds:

class Tag < ActiveRecord::Base 
     has_many :tags_itemses 

     validates_presence_of :name 
     validates_length_of :name, :maximum => 15 
    end 

    class TagsItems < ActiveRecord::Base 
     has_many :tags 
    end 

В моем контроллере я есть индексный метод:

def index 
     items = TagItems.all.includes(:tags) 
     render json: items, 
       status: 200 
     end 

Как контроллер должен выглядит как получить следующие JSON?

[{item_id :1, tags: [{id:1, name: TagA}, {id:2, name: TagB}, {id:3, name: TagC}]}, 
    {item_id :2, tags: [{id:1, name: TagA}, {id:3, name: TagC}]}] 
+0

Какой код вы уже пытались создать json? –

ответ

1

Вы можете настроить вывод JSON с опцией include:

class TagsController 
    def index 
    items = TagItems.all.includes(:tags) 
    render json: items, includes: { 
     tags: { 
     only: [:id, :name] 
     } 
    }, status: 200 
    end 
end 

Но это может получить очень повторяющиеся, хотя и раздувает контроллеры - active_model_serializers могут помочь здесь.

Однако это все равно не сработает, так как ваше моделирование не работает! Имена моделей всегда должны быть единственными! tags_items было бы уместно, если бы это было отношение has_and_belongs_to_many, но это очень частный случай, поскольку это таблица соединений без связанной модели.

gollum grammar

То, что вы хотите здесь использовать has_many :through отношения к установке многие ко многим между тегами и предметов:

class Item < ActiveRecord::Base 
    has_many :tag_items # you're not Gollum! 
    has_many :tags, through: :tag_items 
end 

class Tag < ActiveRecord::Base 
    has_many :tag_items 
    has_many :items, through: :tag_items 
end 

class TagItem < ActiveRecord::Base 
    belongs_to :tag 
    belongs_to :item 
end 

Вы также должны исправить имя таблицы! Создание миграции с rails g migration RenameTagsItems и изменять содержимое:

class RenameTagsItemsMigration < ActiveRecord::Migration 
    def change 
    rename_table :tags_items, :tag_items 
    end 
end 

Затем запустите миграцию (rake db:migrate).

 Смежные вопросы

  • Нет связанных вопросов^_^