2017-10-02 1 views
0

je suit deux modèlesComment effectuer les jointures SQL dans des rails

class MyTable < ApplicationRecord 
    has_many :my_table_joins, dependent: :destroy 
    validates :name, uniqueness: true 
end 

class MyTableJoin < ApplicationRecord 
    belongs_to :some_column, polymorphic: true 
    belongs_to :my_table 
end 

Je le code ci-dessous dans le contrôleur

def index 
    @my_table_data = MyTable.all 
    render(json: @my_table_data) && return unless @my_table_data.empty? 
    render_error(:not_found, 'something...') 
    end 

Il retourne données suivantes:

[ 
    { 
    "id": 1, 
    "name": "SOME_NAME1", 
    "created_at": "2017-09-28T18:51:51.000Z", 
    "updated_at": "2017-09-28T18:51:51.000Z" 
    }, 
    { 
    "id": 2, 
    "name": "SOME_NAME2", 
    "created_at": "2017-09-28T18:51:51.000Z", 
    "updated_at": "2017-09-28T18:51:51.000Z" 
    }, 
] 

Je veux joignez la table MyTableJoin avec MyTable et produisez les données comme suit:

[ 
     { 
     "id": 1, 
     "name": "SOME_NAME1", 
     "created_at": "2017-09-28T18:51:51.000Z", 
     "updated_at": "2017-09-28T18:51:51.000Z" 
     "access_group_joins": [ 
      { 
      "some_column": 1 
      "some_column_type": "some data" 
      "created_at": "2017-01-01 12:00:00", 
      "updated_at": "2017-01-01 12:00:00" 
      }, 
      ... ... 
] 
     } 
     { 
      "id": 2 
      ... ... 
     }] 

Fondamentalement je veux joindre les deux tables et renvoyer toutes les données de MyTable et l'ensemble spécifique de colonnes de MyTableJoin. Comment puis-je y parvenir?

J'ai essayé de créer la portée comme suit

scope :with_joins_data, joins(:my_table_joins) 

Mais essayer de comprendre comment puis-je sélectionner uniquement les colonnes dont j'ai besoin my_columns_table

+0

Pourquoi ne pas simplement configurer un modèle json qui définit la structure dont vous avez besoin, par ex. http://railscasts.com/episodes/322-rabl – jamesc

+0

Ouais .. ou jbuilder .. sauf si vous voulez écrire la requête sql avec l'instruction select. – Anton

+0

Merci, je vais créer des vues. Pouvez-vous me dire comment puis-je effectuer la partie de liaison si? –

Répondre

0

Si vous deviez aller avec l'idée jbuilder, vous pouvez créer une vue à ce qui suit après avoir ajouté/configuré la pierre précieuse dans votre projet:

json.array! @my_table_data do |data| 
    json.id data.id 
    json.name data.name 
    json.created_at data.created_at 
    json.updated_at data.updated_at 

    json.access_group_joins @my_table_data.my_table_joins do |join_data| 
    json.some_column join_data.id 
    json.some_column_type join_data.name 
    json.created_at join_data.created_at 
    json.updated_at join_data.updated_at 
    end 
end 

Il y a beaucoup de différentes façon pour vous c onstruct this. Ce qui précède est l'un d'entre eux. Vous pouvez également utiliser partial! ou extract!.

Si vous avez besoin de charger toutes ces ressources, il est préférable d'exécuter MyTable.includes(:my_table_joins) au lieu de MyTable.all.

Espérons que ça aide.