Rails: A find tip

Търсенето за записи в база данни вероятно е първото нещо, което сте научили след като сте минали през процеса “Как да инсталирам Rails на моята машина?”. И понеже като повечето неща в този framework и търсенето е направено достатъчно интуитивно – няма начин да сте срещнали някакви неудобства.

Нека обаче вземем за пример следната табилца:

mysql> DESCRIBE posts;
+------------+--------------+------+-----+---------+-------------+
| Field      | Type         | Null | Key | Default | Extra       |
+------------+--------------+------+-----+---------+-------------+
| id         | int(11)      | NO   | PRI | NULL    | auto_inc... |
| title      | varchar(255) | YES  |     | NULL    |             |
| body       | text         | YES  |     | NULL    |             |
| published  | tinyint(1)   | YES  |     | NULL    |             |
| created_at | datetime     | YES  |     | NULL    |             |
| updated_at | datetime     | YES  |     | NULL    |             |
+------------+--------------+------+-----+---------+-------------+
6 rows in set (0.00 sec)

Стандартно форматът за търсене на първият запис в таблицата Posts, който има заглавие, съвпадащо с “rails” би трябвало да изглежда по този начин:

@condition = "rails"
@post = Post.find (:first,
        :conditions=>["title LIKE ?", "%#{@condition}%"]
)

Това е перфектен вариант когато търсите срещане за даден стринг само в определена колона от БД. Ако обаче искате да намерите първият записи в таблицата Posts, който съдържа “rails” и в заглавието и в тялото си, ще трябва да модифицирате горният пример по следния начин:

@condition = "rails"
@post = Post.find (:first,
        :conditions=>["title LIKE ? AND body LIKE ?",
        "%#{@condition}%", "%#{@condition}%"]
)

Работещо, но грозно решение, което ме накара да поровя малко из документацията. В крайна сметка стигнах до следното, поне според мен, много по-красиво и практично справяне с проблема:

@condition = "rails"
@post = Post.find (:first,
        :conditions=>["title LIKE :what AND body LIKE :what",
        {:what=>"%#{@condition}%"}]
)

Маркери: , ,

За тази статия



Категории