在我的应用中,我有用户,学校(团体)和课程。我正在尝试建立一个模型,这三个模型中的任何一个都可以向任何其他模型发送请求,并为请求接收者提供接受或拒绝请求的选项。我的想法是设置多态到多态关联,因此rails将识别request_sender和接收者的id和类型。我的第一个问题是,设置poly到poly表来实现这个功能是否有意义,还是我应该尝试不同的东西?如果poly到poly表有意义,我包括我当前的控制器和db表:
我为请求设置的数据库表是:
class CreateRequests < ActiveRecord::Migration
def change
create_table :requests do |t|
t.belongs_to :request_sender, polymorphic: true
t.belongs_to :requestable , polymorphic: true
t.timestamps
end
add_index :requests, [:request_sender_id, :request_sender_type]
add_index :requests, [:requestable_id, :requestable_type]
end
end
这是我的请求控制器,我遇到的问题是定义确定请求发送方和接收方类的方法:
def new
@request = @requestable.requests.new
end
def create
@request = @requestable.requests.new(params[:request])
if @request.save
redirect_to @requestable, notice: "requested."
else
render :new
end
end
private
def load_requestable
klass = [School, User, Course].detect { |c| params["#{c.name.underscore}_id"] }
@requestable = klass.find(params["#{klass.name.underscore}_id"])
end
我非常感谢任何帮助或指导,因为我不熟悉编程和rails,并且对我正在做的事情一无所知哈哈。
答案 0 :(得分:0)
当然,没有理由不能这样做。
创建消息时您需要的是发送创建者和接收者的class_name和ID。所以,假设您的表单发送:
然后,在您的MessagesController
中def create
message = Message.new.tap do |m|
m.sender = params[:sender_class].classify.constantize.find(params[:sender_id])
m.receiver = params[:receiver_class].classify.constantize.find(params[:receiver_id])
m.message = params[:message]
end
if message.save
redirect_to root_path, notice: "Awesome!"
else
render :new
end
end