2015-11-12 4 views
1

Технические характеристики: ruby ​​2.2.1p85, Rails 4.2.3.Содержит в таком состоянии

Это прекрасно работает:

@performances = Performance.where(date: start_date..end_date).includes(:production_page).where(pages: {organization_id: organization_id, layout_id: nil, genre: genre_word}) 

Моя проблема заключается в том, что в настоящее время, жанр и genre_word нужно быть точным совпадением. Мне нужно знать, содержит ли жанр genre_word. Я попробовал включить? (синтаксическая ошибка) и попытался переписать запрос с помощью .find_by_sql.

Пример:

genre_word: Comedy 

pages.genre: Comedy, Drama 

В идеале, pages.genre и genre_word увидят эту запись в матче, так как "комедия" в в pages.genre. Я должен вести поиск по организации_ид и layout_id.

Я ценю любую помощь по этому вопросу.

+0

Я думаю, что у вас это изменилось: 'genre_word: genre' должен быть:' жанр: genre_word'. Затем он должен по крайней мере соответствовать, если на странице есть только «genre_word», заданный как «жанр». Это верно? – zwippie

+0

Вы правы. Редактирование выше. – Brit200313

ответ

1

Решение закончилось тем, что:

@performances = Performance.includes(:production_page) 
    .where("pages.genre LIKE ?", "%#{genre}%").references(:production_page) 

Спасибо всем, кто помог.

0

Операторы SQL LIKE или ILIKE могут выполнять частичное сопоставление строк. Простой пример:

genre_name = "Drama" 
Article.where("genre LIKE ?", "%#{genre_name}%") 

Это будет генерировать запрос SQL:

SELECT "articles".* FROM "articles" WHERE (name LIKE '%Drama%') 

ILIKE является регистронезависимым сестра LIKE. Знак процента будет соответствовать ноль или более символов до или после поискового запроса, поэтому в случае примера он также будет соответствовать, если в статье есть жанр «Комедия, драма».

+0

Я очень ценю ответ, но ключевая часть заключается в том, что мне нужно также поддерживать другие переменные. @performances = Performance.where (date: start_date..end_date) .includes (: production_pagestatus_id: 100, display_on_district_calendar: 1, organization_id: organization_id, layout_id: nil, "genre LIKE?", "% # {genre_word}%"}) приводит к синтаксической ошибке (синтаксическая ошибка, неожиданный ',', expecting => ... layout_id: nil, "genre LIKE?"). – Brit200313

+1

Я вижу. Что делать, если вы добавите еще один '' 'для' 'LIKE'? '@performances = Performance.where (date: start_date..end_date) .includes (: production_page) .where (страницы: {organization_id: organization_id, layout_id: nil}). где (страницы: {" genre LIKE? ","% # {genre_word}% "})' – zwippie

Смежные вопросы