2017-08-28 5 views
0

J'essaie de trouver la meilleure approche plus que tout par cette question. J'ai deux modèles:Comment conserver les données d'une table dans une autre en étant mis à jour sans association dans Ruby On Rails

Letter.rb

class Letter < ApplicationRecord 
    has_many :trackings,dependent: :destroy 
end 

Colonnes de lettre: sous, titre

Tracking.rb

class Tracking < ApplicationRecord 
    belongs_to :letter 
end 

Colonnes de suivi: nombre, Date

J'ai une table comme celui-ci en vue contenant ces colonnes:

traques

Tracking_id/number/date/letter_id/sub/title 

Je veux chercher dans traques via Arel et retourner les dossiers de traques comme les résultats de la recherche.La recherche est multiple, par exemple la première recherche basée sur le nombre et ensuite rechercher les résultats à nouveau en fonction du titre, mais le problème est que je ne peux pas rechercher les associations.

J'ai une solution. Je peux conserver les données des lettres sous forme de nouvelles colonnes dans Trackings, mais si je mets à jour la lettre ailleurs, ces données ne seront pas mises à jour, donc je peux exécuter un travail pour mettre à jour toutes les données de lettres dans les Trackings existants. Je veux savoir qu'il y a une meilleure idée pour couvrir ce problème? ou cette solution suffit?

Merci d'avance.

+0

Votre classe 'Tracking' ne semble pas avoir une référence de table à' Letter' ne devrait-il pas y avoir une colonne 'letter_id' dans la table pour référence?Vous ne savez pas non plus pourquoi vous avez besoin de 'Arel' car la logique de recherche n'est pas très complexe (et croyez-moi je suis un grand défenseur de' Arel' quand il est appelé) – engineersmnky

+0

@engineersmnky Parce que c'est une recherche multiple compliquée action qui est inévitable d'utiliser Arel. La table de suivi contient letter_id. –

Répondre

1

Cherchez vous?

Tracking.includes(:letter).where(number: 1234, letters: {title: 'Hello'}) 

ou si vous avez besoin de plus de contrôle sur la requête de recherche:

Tracking 
    .joins(:letter) 
    .where('trackings.number like :query OR letters.title like :query', query: "%{search_term}%") 

(vous pouvez ajouter des conditions plus que vous le souhaitez)

Cela sur la DB INNER JOIN Letter et Tracking et vous permet d'interroger les colonnes des deux tables dans une instruction. Ceci suppose que chaque Tracking a un Letter. Ainsi, les données peuvent rester là où elles sont et où elles appartiennent. Dans ses tableaux.

+0

La deuxième option n'est pas valide telle quelle et ne créera pas une LEFT OUTER JOIN si vous la modifiez en une chaîne sans ajouter de références (: letters) ' – engineersmnky

+0

@engineersmnky thx. actualisé. –

+0

Eh bien genre de. Le premier est toujours un LEFT OUTER JOIN valide et le second n'est toujours pas valide et devrait être '.where (" trackings.number like: requête OU letters.title like: query ", requête:"% {search_term}% ")' notez les citations. il aurait été tout aussi valable de laisser l'explication de LEFT OUTER JOIN et de changer l'exemple en 'Tracking.includes (: letter) .references (: letters) .where (" trackings.number like: requête OU lettres.title like : query ", requête:"% {search_term}% ")' – engineersmnky

0

Vous n'avez pas besoin de conserver les données de lettres en tant que nouvelles colonnes dans le tableau des suivis. Vous pouvez joindre à la fois la table et extraire les données en fonction de votre requête de recherche.

Tracking.joins(:letter).where("letters.sub like :search or letters.title like :search or trackings.number like :search", search: "%#{SEARCH_QUERY}%") 

Cela REJOIGNEZ la table letters et trackings et permettre à la requête de récupérer les données des deux tables.