如果管理员用户,请不要在SIgnUp上关注邀请

时间:2013-09-14 15:02:49

标签: ruby-on-rails ruby methods admin

我已按照本教程创建了一个BETA邀请系统。 http://railscasts.com/episodes/124-beta-invitations。用户也可以在我的Rails应用程序中互相关注。

目前,我有两种方法:

  1. 允许用户在注册时关注所有ADMIN USERS。

  2. 允许用户在注册时关注邀请函。

  3. 我遇到的问题是:

    no such column: TRUE: SELECT DISTINCT "users".* FROM "users" INNER JOIN 
    "invitations" ON "invitations"."id" = "users"."invitation_id" WHERE
    (invitations.recipient_email = 'spedroza@usc.edu' OR users.admin IS TRUE)
    

    无论如何修复第二种方法,如果他是管理员用户,它就不会跟随邀请者?

    MODEL

    USER

    class User < ActiveRecord::Base
      attr_accessible :name, :email, :password, :password_confirmation, :invitation_token
    
      has_many :relationships, foreign_key: "follower_id", dependent: :destroy
      has_many :followed_users, through: :relationships, source: :followed
    
      has_many :reverse_relationships, foreign_key: "followed_id",
                                   class_name:  "Relationship",
                                   dependent:   :destroy
      has_many :followers, through: :reverse_relationships, source: :follower
    
      has_many :sent_invitations, :class_name => 'Invitations', :foreign_key => 'sender_id'
      belongs_to :invitation
    
      after_create follow_inviter_and_admins      #--------HERE!!
    
      def follow_inviter_and_admins               #--------HERE!!
         return true if admin?
         users = User.joins(:invitation).where('invitations.recipient_email = ? OR users.admin IS admin', email).uniq
         users.each do |user|
           self.follow!(user)
         end
      end
    
      def invitation_token
        invitation.token if invitation
      end
    
      def invitation_token=(token)
        self.invitation = Invitation.find_by_token(token)
      end
    
      def following?(other_user)
        relationships.find_by_followed_id(other_user.id)
      end
    
      def follow!(other_user)
        relationships.create!(followed_id: other_user.id)
      end
    
    end
    

    关系

    class Relationship < ActiveRecord::Base
    
      attr_accessible :followed_id
    
      belongs_to :follower, class_name: "User"
      belongs_to :followed, class_name: "User"
    
      validates :follower_id, presence: true
      validates :followed_id, presence: true
    end
    

    邀请

    class Invitation < ActiveRecord::Base
      attr_accessible :recipient_email, :sender_id, :sent_at, :token
    
      belongs_to :sender, :class_name => "User"
    
      VALID_EMAIL_REGEX = /\A[\w+\-.]+@[a-z\d\-.]+\.[a-z]+\z/i
    
      before_create :generate_token
    
      private
    
       def generate_token
          self.token = Digest::SHA1.hexdigest([Time.now, rand].join)
       end
    
    end
    

    SCHEMA

    create_table "users", :force => true do |t|
        t.string   "name"
        t.string   "email"
        t.integer  "invitation_id"
        t.integer  "invitation_limit"
        t.boolean  "admin",                  :default => false   #----------HERE!!
        t.timestamp "created_at",                                :null => false
        t.timestamp "updated_at",                                :null => false
        t.string    "password_reset_token"
        t.timestamp "password_reset_sent_at"
      end
    
      create_table "invitations", :force => true do |t|
        t.integer  "sender_id"
        t.string   "recipient_email"
        t.string   "token"
        t.datetime "sent_at"
        t.datetime "created_at",      :null => false
        t.datetime "updated_at",      :null => false
     end
    

2 个答案:

答案 0 :(得分:1)

例如,您可以在表格用户中找到所有唯一值。

# user.rb

after_create :follow_inviter_and_admins

def follow_inviter_and_admins
  return true if admin?
  sender_id = Invitation.where(recipient_email: email).first.try(:sender_id)
  users = User.where('id = ? OR users.admin = ?', sender_id, true).uniq
  users.each do |user|
    self.follow!(user)
  end
end

这样的事情应该从表users中选择不同的值,这些值是管理员或邀请者。因为值是唯一的,所以错误应该消失

答案 1 :(得分:0)

好吧试试这个

def follow_inviter                                
 inviter = Invitation.find_all_by_recipient_email(email)
 inviter.each do |invite|
 unless self.follow?invite.sender
  self.follow!(invite.sender)
 end
 end
end