2017-06-19 1 views
0

Je suis nouveau sur les rails et coincé entre impatient-chargement des 2 derniers jours. J'ai deux modèles Car et Images avec l'association Car has_many :images. et j'ai fait un api qui renvoie json tableau de voitures avec leurs images. Je veux une image unique au lieu de toutes les images de l'association. Je suis en utilisant comme:Obtenir un seul enregistrement de has_many en utilisant eager-loading en include

Car.where(:company=>"BMW").as_json(:include=> {:images}) 

Ceci renverra toutes les voitures avec leurs toutes les images. Je veux toutes les voitures avec leur seule image au lieu de tout tableau d'images.

+0

Ajouter une autre association dans le modèle 'Car':' has_one: image' alors vous pouvez faire: 'Car.where (: company => "BMW"). as_json (: include => {: image}) ' – Surya

+0

@Nitisha - quelle image voulez-vous: le premier? – BKSpurgeon

+0

Peut-être ajouter un drapeau aux "images" qui définit une image principale et la contraindre à un par la validation. – engineersmnky

Répondre

2

Vous devez ajouter has_one :image, -> { order(updated_at: :desc) } au modèle Car. Cela définira un default_scope à l'association.

Ensuite, vous pouvez obtenir toutes les voitures avec une seule image dernière mise à jour par voiture:

Car.where(company: 'BMW').as_json(include: [:image])

+1

Je ne pense pas que 'default_scope' en général est une bonne idée. [Premier] (http://www.ombulabs.com/blog/ruby/rails/best-practices/why-using-default-scope-is-a-bad-idea.html) et [second] (https://rails-bestpractices.com/posts/2013/06/15/default_scope-is-evil/) lien expliquant pourquoi –

+0

@MartinZinovsky vous avez mélangé ceci. Vos liens parlent de 'default_scope' pour le modèle entier. Mon approche pour l'ajouter seulement à l'association. – DjezzzL

+0

est-il bon de définir deux relations différentes pour l'image comme has_many: images et has_many: image? – Nitisha

0

Cela dépend de ce dont vous avez besoin.

  1. Si vous avez besoin d'abord, s'il vous plaît écrivez: Car.where(company: "BMW").first
  2. Si vous avez besoin dernier, s'il vous plaît écrivez: Car.where(company: "BMW").last

Est-il suffisant pour vous?

Si vous avez has_many association vous devez choisir quel enregistrement vous avez besoin (peut-être ajouter un drapeau). Sans cela, vous aurez une collection de tous les objets d'association.

Un plus est préférable d'utiliser where(company: "BMW") que where(:company => "BMW")

+0

avez-vous lu mon problème? Je ne pense pas que selon votre réponse, ce n'est pas une bonne astuce pour écrire des augmentations. Des réponses significatives seront automatiquement répercutées par les utilisateurs. – Nitisha