2010-05-12 4 views
3

Je le code suivant:validates_uniqueness_of ... limiter la portée - Comment puis-je limiter quelqu'un de créer un certain nombre d'entrées

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

qui limite une personne de « goût » d'un site plus d'une fois sur la base sur une requête ip distante. Essentiellement, quand quelqu'un "aime" un site, un enregistrement est créé dans la table des J'aime et j'utilise un champ caché pour demander et passer son adresse IP à la colonne: ip_address dans la table like. Avec le code ci-dessus je limite l'utilisateur à un "j'aime" par leur adresse IP. Je voudrais limiter à un certain nombre, par exemple 10.

Ma pensée initiale était de faire quelque chose comme ceci:

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

Mais cela ne semble pas fonctionner. Y a-t-il ici une syntaxe simple qui me permettra de faire une telle chose?

Répondre

2

Vous pouvez essayer ceci:

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 

Note:

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

Ce que tu fais pour obtenir l'adresse IP le client? Vous pouvez obtenir l'adresse IP à partir de l'objet de requête.

.: Dans votre par exemple contrôleur/vue:

request.remote_ip 
+0

Je passe avec succès l'adresse_ip à travers une requête distante à la table similaire. Je viens de mettre votre code et aucun dé. Obtenir une erreur pour 'méthode non définie pour' count '. En se référant à "like_count". – bgadoci

+0

Mise à jour de ma réponse, réessayez. –

+0

Ah, toujours pas aller. Mais cela fait partie de la même application que je vais vous donner accès. Je pense que vous l'aimerez réellement, je suis plutôt satisfait d'aller aussi loin. Beaucoup d'amusement. – bgadoci

0

Il n'y a pas de macro de raccourci.

Vous aurez besoin quelque chose comme:

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 
+0

Ok, donc je viens d'ajouter le code de votre écrit ci-dessus et les pauses rien qui est toujours grande de la porte. Cependant, cela ne semble pas m'empêcher après 10 actions. – bgadoci

+0

Je viens de copier et de passer ce code. Ai-je besoin d'éditer quelque chose? – bgadoci

+0

désolé, je viens de taper sur le dessus de ma tête, je ne l'ai pas testé. Essayez d'exécuter la requête de comptage directement et voir si cela fonctionne correctement – gtd

Questions connexes