希望有人可以帮助我。目前正在开发一个需要奇怪功能的RoR项目。
基本上,我有两种类型的用户名为User和Researcher。用户可以创建表单,这些表单存储在数据库中并由研究人员填写。
我有这个基本架构
create_table "form_fields", :force => true do |t|
t.string "name"
t.string "form_field_type"
t.integer "form_id"
t.datetime "created_at"
t.datetime "updated_at"
end
create_table "forms", :force => true do |t|
t.integer "visit_id"
t.string "name"
t.integer "form_category_id"
t.datetime "created_at"
t.datetime "updated_at"
end
create_table "researchers", :force => true do |t|
t.string "email", :default => "", :null => false
t.string "encrypted_password", :limit => 128, :default => "", :null => false
t.string "password_salt", :default => "", :null => false
t.string "reset_password_token"
t.string "remember_token"
t.datetime "remember_created_at"
t.integer "sign_in_count", :default => 0
t.datetime "current_sign_in_at"
t.datetime "last_sign_in_at"
t.string "current_sign_in_ip"
t.string "last_sign_in_ip"
t.datetime "created_at"
t.datetime "updated_at"
end
add_index "researchers", ["email"], :name => "index_researchers_on_email", :unique => true
add_index "researchers", ["reset_password_token"], :name => "index_researchers_on_reset_password_token", :unique => true
create_table "results", :force => true do |t|
t.integer "form_id"
t.integer "subject_id"
t.string "form_field_name"
t.string "form_field_value"
t.datetime "created_at"
t.datetime "updated_at"
end
create_table "users", :force => true do |t|
t.string "email", :default => "", :null => false
t.string "encrypted_password", :limit => 128, :default => "", :null => false
t.string "password_salt", :default => "", :null => false
t.string "reset_password_token"
t.string "remember_token"
t.datetime "remember_created_at"
t.integer "sign_in_count", :default => 0
t.datetime "current_sign_in_at"
t.datetime "last_sign_in_at"
t.string "current_sign_in_ip"
t.string "last_sign_in_ip"
t.datetime "created_at"
t.datetime "updated_at"
end
add_index "users", ["email"], :name => "index_users_on_email", :unique => true
add_index "users", ["reset_password_token"], :name => "index_users_on_reset_password_token", :unique => true
create_table "visits", :force => true do |t|
t.string "name"
t.integer "visit_order"
t.integer "study_id"
t.datetime "created_at"
t.datetime "updated_at"
end
因此,用户创建表单和form_fields,然后研究人员登录并提供此表单
<% form_for [:researcher, @study, @subject, @visit, @form, Result.new] do |f| %>
<% @form.form_fields.each do |form_field| %>
<%= f.label form_field.name, :index => form_field.id %>
<%= f.hidden_field :form_field_name, :value=>form_field.name, :index => form_field.id %>
<%= f.text_field :form_field_value, :index => form_field.id %><br/>
<%= f.hidden_field :form_id, :value=>@form.id, :index => form_field.id %>
<%= f.hidden_field :subject_id, :value=>@subject.id, :index => form_field.id %>
<% end %>
<%= f.submit %>
<% end %>
所以结果存储在结果表中,就是那个。
在尝试允许用户在每个form_field上设置验证时,我发现自己遇到了麻烦。
有人有这方面的经验吗?
答案 0 :(得分:1)
以下是我将如何处理......
我会拥有User
has_many
模型的Form
模型。每个Form模型都有很多FormComponents
。 FormComponent
模型将包含表单元素类型,验证类型,默认值等字段。
Researcher
将由FormController
提供表单,该表单将处理模型并根据FormComponents
存在的内容显示表单。当Researcher
填写表单后,我会将回复打包为属于FormResponse
和Researcher
的{{1}}。
请记住,这只是对这个想法如何发挥作用的粗略概念,但在我看来,类似于此的计划将是处理它的最佳方式。
答案 1 :(得分:0)
我实际上会更清楚地研究这个问题使用单表继承。
您可以创建模型用户,并在user.rb文件中定义研究人员和用户共同的所有验证和方法。
class User < ActiveRecord::Base
#all validations code and other logic related to users and researchers
end
创建另一个模型研究员.rb,如
class Researcher < User
#create validations and logic code specific to researcher
end
只有一个表“用户”。还有一个额外的列(除了所有电子邮件,名称等等),这是“类型”列。此类型列指的是记录是研究人员还是用户。
在researcher.rb中定义一些方法,如
def can_fill_form?
return true
end
并在user.rb中使用相同的方法,如
def can_fill_form?
return false
end
通过这样做,您只需要一个包含所有用户和研究人员的表。像电子邮件,电话,密码这样的东西都是一样的,在这里创建一个单独类型的表是多余的。