2016-05-14 3 views
-1

Datenbanktabellen, erste Tabelle enthält Tags (ID, Name) Die zweite Tabelle enthält die Beziehung zwischen Elementen und Tags.So erstellen Sie ActionController zum Abrufen von Elementen mit einer Liste von Tags

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 

Aktive 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 

In meinem Controller ich habe Index-Methode:

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

Wie der Controller sollte aussieht folgende json zu bekommen?

[{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

Welchen Code haben Sie bereits versucht, den JSON zu produzieren? –

Antwort

1

Sie können die JSON-Ausgabe mit der include Option anpassen:

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

Aber dies aber sehr eintönig und bläht Ihre Controller - active_model_serializers kann hier helfen.

Allerdings das wird immer noch nicht funktionieren, da Ihre Modellierung weg ist! Models Namen sollten immer im Singular sein! tags_items wäre geeignet, wenn es eine has_and_belongs_to_many Beziehung wäre, aber das ist ein ganz besonderer Fall, da das eine Join-Tabelle ohne ein zugehöriges Modell ist.

gollum grammar

Was wollen Sie hier eine has_many :through Beziehung zu Setup verwenden, eine viele zu viele zwischen den Tags und Artikel:

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 

Sie müssen auch den Namen der Tabelle korrigieren! Erstellen Sie eine Migration mit rails g migration RenameTagsItems und ändern Sie den Inhalt:

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

Dann die Migration laufen (rake db:migrate).

Verwandte Themen