mausspb
@mausspb
web разработчик, системный администратор

Как работать с результатом запроса из RoR в БД?

Есть модель в RoR. Делаю запрос в БД , должно вернуться из запроса boolean значение.
logger.debug "subscribe_on subs-: #{subs}"
- показывает
subscribe_on subs-: #Subscription:0x7f9954e08158


logger.debug "subscribe_on subs-: #{subs.inspect}"
показывает
subscribe_on subs-: #Subscription subscribe: false


Какой тип данных возвращает запрос и как из него получить boolean тип ?

Upd:
Модель :
validates :email, :presence=> true, 
  					:format=> VALID_EMAIL_REGEX,
  					:uniqueness=> {:if=> :subscribe_on?}
def subscribe_on?
  subs = Subscription.find(:email self.email).subscribe
  logger.debug "subscribe_on subs-: #{subs}"
end

UPD2:
В общем -то нужен почти такой код
class Subscription < ActiveRecord::Base
  before_save { self.email = email.downcase}
  VALID_EMAIL_REGEX = /\A[\w+\-.]+@[a-z\d\-.]+\.[a-z]+\z/i
  validates :email, :presence=> true, :format=> VALID_EMAIL_REGEX, :uniqueness=> {:scope => :subscribe}

Выполняется такой запрос
SELECT 1 FROM `subscriptions` WHERE `subscriptions`.`subscribe` = 0 AND (`subscriptions`.`email` = BINARY 'no@ma.ru') LIMIT 1


А надо вместо subscribe` = 0
subscribe` = 1
Пока не получилось( , как ?
ruby 1.8.7
  • Вопрос задан
  • 274 просмотра
Решения вопроса 2
MAXOPKA
@MAXOPKA
class Subscription < ActiveRecord::Base
  before_save { email = email.downcase}
  VALID_EMAIL_REGEX = /\A[\w+\-.]+@[a-z\d\-.]+\.[a-z]+\z/i
  validates :email, :presence=> true, :format=> VALID_EMAIL_REGEX, :uniqueness=> {:if=> :subscribe_on?}
  
  scope :subscribe_on, lambda(subscribe_email){ where(email: subscribe_email, subscribe: true) }
        
  def subscribe_on?
    subs = self.class.subscribe_on(email)
    logger.debug "subscribe_on subs-: #{subs}"
    subs.first
  end
end
Ответ написан
mausspb
@mausspb Автор вопроса
web разработчик, системный администратор
Вероятно криво\косо, но задачу решил таким способом
class Subscription < ActiveRecord::Base
  before_save { self.email = email.downcase}
  VALID_EMAIL_REGEX = /\A[\w+\-.]+@[a-z\d\-.]+\.[a-z]+\z/i
  validates :email, :presence=> true, :format=> VALID_EMAIL_REGEX, :uniqueness=> {:if=> :subscribe_on?}
  
        
  def subscribe_on?
    subs = Subscription.where(:email=>self.email)
    unless subs.size == 0
      subs = subs.first
      subs1 = subs.subscribe 
    end
    
  end
end

Работает на ruby 1.8.7
Ответ написан
Комментировать
Пригласить эксперта
Ответы на вопрос 2
Freika
@Freika
Senior Ruby on Rails developer
Если у вас модель Subscription с булевым атрибутом subscribe, то и запрашивать нужно subs.subscribe. Это должно вернуть true или false.
Ответ написан
ibub1ik
@ibub1ik
Ruby/Rails Dev => Elixir
Стоило вынести сам запрос в тело вопроса, а то не очень понятно. Из комментов я понял, что вы строите запрос через модель, так что возвращаться будут экземпляр(ы) этой модели. При этом если вы через select указываете атрибуты, которые должен вернуть запрос, то только они и будут в модели.
Допустим у вас есть модель Foo с атрибутами bar и baz.
f = Foo.select(:bar).first
# выведет bar
f.bar
# будет ошибка, т.к. этот атрибут не был загружен
f.baz
Ответ написан
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Похожие вопросы