validates_uniqueness_of ... ограничение объема - Как я могу запретить кому-либо создавать определенное количество записей - PullRequest
3 голосов
/ 12 мая 2010

У меня есть следующий код:

class Like < ActiveRecord::Base
  belongs_to :site
  validates_uniqueness_of :ip_address, :scope => [:site_id]
end

Что ограничивает человека от "симпатии" к сайту более одного раза на основе удаленного IP-запроса. По сути, когда кому-то «нравится» сайт, в таблице Likes создается запись, и я использую скрытое поле, чтобы запросить и передать его IP-адрес в столбец: ip_address в аналогичной таблице. С помощью приведенного выше кода я ограничиваю пользователя одним «лайком» на его IP-адрес. Я хотел бы ограничить это определенным числом, например 10.

Моя первоначальная мысль была сделать что-то вроде этого:

validates_uniqueness_of :ip_address, :scope => [:site_id, :limit => 10]

Но это не похоже на работу. Есть ли здесь простой синтаксис, который позволит мне делать такие вещи?

Ответы [ 2 ]

2 голосов
/ 14 мая 2010

Вы можете попробовать это:

class Like < ActiveRecord::Base
  validates_each :ip_address do |row, attr, value|
    m.errors.add :ip_address, 'Too many likes' unless row.like_count < 10
  end

  def like_count
    Like.count(:conditions => {:ip_address => ip_address, :site_id => site_id})
  end
end

Примечание:

I use a hidden field to request and pass their ip address to the :ip_address 
column in the like table. 

Вы делаете это, чтобы получить IP-адрес клиента? Вы можете получить IP-адрес от объекта запроса.

Например: в вашем контроллере / представлении:

request.remote_ip
0 голосов
/ 12 мая 2010

Нет макросов быстрого доступа.

Вам понадобится что-то вроде:

validate do |record|
  if count(:conditions => ['`id` <> ? AND `ip_address` = ? AND `site_id` = ?',
                           record.id, record.ip_address, record.site_id]) > 10
    record.errors.add(:ip_address, "has been liked the maximum number of times")
  end
end
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...