Оригинальный вопрос
Мое приложение имеет дело с "Машинами". У машин есть спецификации, написано столько же "Specs". Каждая из этих спецификаций содержит ссылку на «Spec_Field» (такие поля, как «Вес», «Высота», «Емкость» и т. д.) и значение.
Class Machine
has_many :specs
has_many :spec_fields, :through => :specs
Class Spec
belongs_to :machine
belongs_to :spec_field
Что я хочу сделать, так это иметь функцию поиска в действии #show для каждой машины, где пользователь отмечает спецификации, которые он хочет сопоставить («Да, длина 50 — это то, что мне нужно, а емкость 500 идеальна, я ширина не важна»), и нажимает «Найти похожие», после чего будут найдены все машины с похожими характеристиками.
Я предполагаю, что мне понадобится модель для поиска, похожая на следующий скринкаст: http://railscasts.com/episodes/111-advanced-search-form-revised?autoplay=true
Затем в действии #show для машины мне нужно будет просмотреть спецификации этой машины и добавить их в экземпляр «Поиск». Значит ли это, что «Спецификация» также должна принадлежать «Поиску»?
Я просто не могу понять, как организовать все в моем случае. Любая помощь приветствуется!
Схема базы данных
Машины:
t.string "title"
t.text "description"
t.datetime "created_at", :null => false
t.datetime "updated_at", :null => false
t.string "status"
t.integer "category_id"
t.string "manufacturer"
t.string "model"
t.string "serial"
t.string "year"
t.string "location"
Характеристики:
t.integer "machine_id"
t.integer "field_id"
t.text "value"
t.float "base_value"
t.integer "unit_id"
t.datetime "created_at", :null => false
t.datetime "updated_at", :null => false
Поля спецификации:
t.string "label"
t.integer "base_units"
Решение, которое кажется рабочим
Я добавил область «Со спецификацией», которая использует SQL «IN» с «SELECT»
def self.with_spec(field_id,value)
min_value = value.to_f * 0.8
max_value = value.to_f * 1.2
where("machines.id IN (SELECT machine_id FROM specs WHERE field_id = ? AND value > ? AND value < ?)",field_id,min_value,max_value)
end