我已按照本教程创建了一个BETA邀请系统。 http://railscasts.com/episodes/124-beta-invitations。用户也可以在我的Rails应用程序中互相关注。
目前,我有两种方法:
允许用户在注册时关注所有ADMIN USERS。
允许用户在注册时关注邀请函。
我遇到的问题是:
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
答案 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