Как использовать пользовательскую переменную ruby ​​​​в mysql?

Я работаю над приложением Rails 3.2.9 с ruby ​​​​1.9.3 и mysql 5.5. Мне нужно написать запрос, в котором я должен использовать определяемую пользователем переменную в предложении where в моем файле контроллера. Вот код .. Пожалуйста, дайте мне знать, как я могу это сделать! и если нет, то как я могу преобразовать объект (я так думаю), который я получаю из строки кода № 4, чтобы я мог сравнить его с fixnum позже

def is_user_allowed?
    @company_id = params[:user][:company_id]

    #THIS LINES GIVES A SYNTAX ERROR AT '?'
    @no_of_licenses = Company.find_by_sql("SELECT NO_OF_LICENSES FROM COMPANIES WHERE ID=?",@company_id)

    #THIS LINE RETURNS AN OBJECT I GUESS N HENCE CANNOT COMPARE WITH FIXNUM
    @no_of_licenses = Company.find(:first,:conditions => ["id = ?",@company_id] , :select => 'no_of_licenses')   

    @present_users = User.where("company_id = ?", @company_id).count

    if @present_users < @no_of_licenses
      return true
    else
      return false
    end
  end

person Aks..    schedule 30.05.2013    source источник


Ответы (2)


Вам просто нужно вызвать имя поля (имя столбца) в возвращаемом объекте. Например:

@no_of_licenses = Company.find(:first,:conditions => ["id = ?",@company_id] , :select => 'no_of_licenses').no_of_licenses

Приведенный выше запрос можно упростить как

@no_of_licenses = Company.where(:id => @company_id).pluck(:no_of_licenses).first
person Amit Thawait    schedule 30.05.2013

@no_of_licenses = Company.find_by_sql("SELECT NO_OF_LICENSES FROM COMPANIES WHERE ID= #{@company_id}")

Я думаю, это .. то, что ты хочешь.

person Sonal S.    schedule 30.05.2013
comment
Что ж, я не буду рекомендовать это решение, потому что @company_id напрямую взят из параметров как @company_id = params[:user][:company_id] . Итак, есть возможность SQL Injection. - person Amit Thawait; 30.05.2013
comment
Company.select(:no_of_lincenses).where(:id =› @company_id) Вы также можете использовать это. Он будет работать в рельсах 3.2.12 - person Sonal S.; 30.05.2013