Байланысты нысандары бар элементтерді көрсету үшін ауқымды пайдалану

Автомобильдердің тізімін сүзу үшін meta_search пайдаланамын. Автомобиль моделі келесідей анықталады:

class Car < ActiveRecord::Base
  has_many    :images, :class_name => "CarImage"
  ......
end

Мен meta_search арқылы қолдануға болатын көлемді анықтағым келеді және кем дегенде кескіні бар көліктерді ғана қайтарыңыз . Жалғыз жұмыс жасай алатынымның бірі - ауқымның ішінде біріктіруді жазу, бірақ бұл көлік құралының қайталанатын нысандарын қайтарады:

scope :with_images, joins(:images)

Егер мен нақты мәндерді таңдауға тырысатын болсам, келесідей:

scope :with_images, joins(:images).select('DISTINCT cars.*')

... Мен іздеу нәтижелеріне сүйенетін басқа әдістерді (мысалы, avg және агрегаторларды санау, топтық бөлімдермен) араластырамын.

ruby on Rails Guides арқылы қараған кезде, мен любопытный мысал таптым, ол менің проблема, бірақ оны жұмыс істей алмайды және оны қалай істегенін білмеймін:

scope :published_and_commented, published.and(self.arel_table[:comments_count].gt(0))

Егер self.arel_table [: images_count] қолдансам, онда ол нөлдік нысан деп айтады.

Өтініште біз ассоциация кестелерінен атрибуттарды пайдалану арқылы сүзуге және іздеуге байланысты қиындықтар бар. Біз қарапайым cars кестесіне атрибутты жылжыту арқылы кейбір мәселелерді шештік, бірақ бұл өте ақылды, бірақ ол жылдам орындалады.

Менің пікірімше, бұл қауымдастық бірінші кезекте кем дегенде бір сурет бар ағымдағы іздеуде барлық автокөлік иелерінің тізімін алады деп ойлағаннан кейін (бұл қарапайым INNER JOIN арқылы жасалуы мүмкін) және DISTINCT id ) және содан кейін WHERE id идентификаторы арқылы [id_1, id_2, id_3, .. ., id_n] сөйлемі.

Сізге бұл ақылға қонымды ба? Мен мұны қалай істей аламын? : D

Сондай-ақ, егер мен оны SQL-мен ғана жасай алатын болсам, онда Arel немесе MetaWhere ...

0

1 жауаптар

Rals гиддерінде тапқандарыңыз ең қарапайым әрі ең жылдам өту жолы.

comments_count is a counter_cache htat you can set on associations to get the number of children.

Оны оңай орындаңыз:

has_many    :images, :class_name => "CarImage", :counter_cache => true

Содан кейін бұрынғы жоқ images_count -қа қол жеткізе аласыз.

See doc.

2
қосылды
Жақсы! Мен қазір counter_cache туралы оқимын: RailsCasts . Маған көшіру арқылы кестеге жаңа баған қосу керек сияқты ... Менің ойымша, сіз оны қалай ұсынсаңыз, сол кезде Белгісіз кілттер (тер): counter_cache болдым.
қосылды автор Cristian, көзі
иә, көші-қон туралы ұмытып кеттім.) Құжатта да түсіндіріледі.
қосылды автор apneadiving, көзі