0

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

目前,我有两种方法:

  1. 允许用户在注册时关注所有管理员用户。

  2. 允许用户在注册时关注 INVITER。

我遇到的问题是:

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)

有没有办法解决第二种方法,所以如果他是管理员用户,它就不会跟随邀请者?

模型

用户

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

架构

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
4

2 回答 2

1

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

# 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中选择不同的值,这些值是管理员或邀请者。因为值是唯一的,所以错误应该消失

于 2013-09-14T21:14:37.287 回答
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
于 2013-09-14T15:53:23.700 回答