Поиск по нескольким активным моделям записей без использования sphinx или solr - PullRequest
0 голосов
/ 20 марта 2011

Каков наилучший способ поиска по нескольким моделям активных записей без использования чего-либо вроде sphinx или solr?

Ответы [ 3 ]

3 голосов
/ 20 марта 2011

Я использую IndexTank http://indextank.com/

2 голосов
/ 20 марта 2011

Самое простое решение - наследовать модели от одной и хранить ее в одной таблице.Однако очень плохо, если у вас есть существующая схема или модели сильно отличаются.

Другое (и я думаю, гораздо лучшее) решение (если ваша база данных позволяет это) - использовать UNION в вашем SQL для получения результатов изнесколько столов.В этом случае вы должны использовать find_by_sql.

Например, если у вас есть модели Post и Question и вы хотите перечислить обе в один список (и отфильтровать их по некоторым условиям, возможно), вам следует:

  • Добавить поле type к каждой таблице со значением по умолчанию, соответствующим названию модели.Например:

    create_table :questions do |t|
      t.text :text
      t.string :type, :null => false, :default => 'Question'
    
      t.timestamps
    end
    
  • Запросите обе модели следующим образом:

    Post.find_by_sql("SELECT id,type,created_at,updated_at,title,description,NULL AS text FROM posts 
      UNION SELECT id,type,created_at,updated_at,NULL as title, NULL AS description, text FROM questions 
      ORDER BY created_at DESC")
    

Использование type поля Rails будет различать разные модели ивозвратите список сообщений и вопросов, так что вы можете искать (или разбивать на страницы) оба.

0 голосов
/ 20 марта 2011

Предполагая, что вы используете реляционную базу данных, вам лучше всего писать необработанные операторы SQL.

Посмотрите на http://api.rubyonrails.org/classes/ActiveRecord/Base.html#method-c-find_by_sql

Item.find_by_sql("SELECT items.name, users.last_name, products.reference_number ... JOIN... ")

...вело бы вернуть коллекцию Item, но с атрибутами, возвращаемыми запросом SQL.Таким образом, в приведенном выше примере каждый возвращенный экземпляр Item будет иметь атрибуты name, last_name и reference_number, даже если они на самом деле не являются атрибутами Item.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...