Проверка истинности логического столбца в MySQL / Rails - PullRequest
0 голосов
/ 06 мая 2010

Rails и MySQL:

У меня есть таблица с несколькими логическими столбцами, представляющими теги. Я хочу найти все строки, для которых конкретный из этих столбцов является «истиной» (или, как мне кажется, в случае MySQL, «1»). У меня есть следующий код на мой взгляд.

@tag = params[:tag]

@supplies = Supply.find(:all,
  :conditions=>["? IS NOT NULL and ? !=''", @tag, @tag], :order=>'name')

@tag передается с URL. Почему же тогда вместо этого я получаю все свои @supplies (т.е. каждую строку), а не только те, которые являются истинными для столбца для @ tag.

Спасибо!

Ответы [ 2 ]

1 голос
/ 06 мая 2010

Если params[:tag] установлено на foo, метод find генерирует этот запрос:

select * from supplies where 'foo' is not null and 'foo' != '' order by name;

Это возвращает все ваши Supply записи, потому что оба условия всегда выполняются.

  1. 'foo' is not null
  2. 'foo' != ''

Конечно, вы хотите, чтобы params[:tag] было именем столбца, но это просто ужасный дизайн.

В вашей модели Supply должен быть атрибут tag и использовать следующий искатель:

@supplies = Supply.all(:conditions => ["tag = ?", params[:tag]], :order => "name")

Если вы действительно хотите, чтобы у расходных материалов была опция для нескольких тегов, используйте:

class Supply < ActiveRecord::Base
  has_and_belongs_to_many :tags
end

class Tag < ActiveRecord::Base
  has_and_belongs_to_many :supplies
end

@supplies = Supplies.all(:conditions => {:tags => ['foo', 'bar']}, :order => "name")
0 голосов
/ 06 мая 2010

Я думаю, это то, что вы хотите сделать

@tag = params[:tag]
@supplies = Supply.find(:all, :conditions=>["? = ?", @tag, true], :order=>'name')
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...