我正在为我的网页制作推荐系统。到目前为止,我创建了一个具有1对1自我引用关联的设计用户。
class User < ActiveRecord::Base
before_create :create_ref
# Include default devise modules. Others available are:
# :confirmable, :lockable, :timeoutable and :omniauthable
devise :database_authenticatable, :registerable,
:recoverable, :rememberable, :trackable, :validatable
has_many :accounts
has_one :referel, class_name: "User", foreign_key: :user_id
belongs_to :referer, class_name: "User", foreign_key: :user_id
end
此用户会获得一个唯一的引荐号ref
,该号码会包含在他可以与朋友分享的推介链接中。路线看起来像这样
get '/join/:ref' => 'devise/registrations#new'
post '/join/:ref' => 'devise/registrations#create'
现在,如果用户a有参考号1340且用户b打开/join/1340
,我可以通过params[:ref]
获得正确的号码,这会再次导致用户a。但我不确定如何在新建或动作上将用户b的user_id设置为User.find_by_ref(params[:ref]).id
。
我已经创建了用于注册的设计控制器,但我不知道如何以正确的方式改变新方法。
我还尝试使用before_create
在用户模型中调用实例方法,但是当我调用create方法时,url将在我使用params之前更改。
有关于此的任何想法吗?
最好的问候。
答案 0 :(得分:0)
现在有了一些解决方法。对此并不完全满意,但这是一个开始...
我正在使用应用程序控制器中的会话来保存ref
来自我的参数并将其放入隐藏的表单字段中。看起来像这样:
class ApplicationController < ActionController::Base
before_action :capture_ref
private
def capture_ref
session[:ref] = params[:ref] if params[:ref]
end
它运作良好,但我不认为它非常精益,因为这个方法在每个动作都被触发,即使我只需要注册。此外,我不喜欢使用隐藏字段,因为它有时可能是一个安全问题所以我会尝试将其放入我的模型中。