Rails, позволяя пользователям создавать форму, которая будет использоваться другими пользователями - PullRequest
3 голосов
/ 11 октября 2010

Надеюсь, кто-нибудь может мне помочь.В настоящее время работаю над проектом RoR, который нуждается в странной функциональности.

По сути, у меня есть два типа пользователей: Пользователь и Исследователь.Пользователи могут создавать формы, и эти формы хранятся в БД и заполняются исследователями.

У меня есть эта базовая схема

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 %>

Таким образом, результат сохраняется в таблице результатов, и это все.

Я могу столкнуться с проблемами при попытке разрешить пользователямустановить валидацию в каждом поле формы.

Кто-нибудь имеет опыт решения этой проблемы?

Ответы [ 2 ]

1 голос
/ 07 августа 2012

Вот как бы я справился с этим ...

У меня была бы User модель, которая has_many Form модели. Каждая модель формы будет иметь много FormComponents. Модель FormComponent будет иметь поля для какого типа элемента формы, какого типа проверки, значений по умолчанию и т. Д.

Researcher будет обслуживать форму с помощью FormController, которая будет обрабатывать модель и отображать форму на основе того, что присутствовало FormComponents. Когда Researcher заполняет форму, я упаковываю ответ как FormResponse, принадлежащий как этому Researcher, так и Form.

Имейте в виду, что это лишь приблизительное представление о том, как эта идея будет реализована, но, на мой взгляд, схема, подобная этой, будет лучшим способом справиться с ней.

0 голосов
/ 11 октября 2010

Я бы на самом деле посмотрел на эту проблему более чисто, используя наследование одной таблицы.

Вы создаете модель User и определяете все валидации и методы, общие как для исследователя, так и для пользователя, в файле user.rb.

class User < ActiveRecord::Base
  #all validations code and other logic related to users and researchers
end

Создайте еще одну исследовательскую модель, например

.
class Researcher < User
   #create validations and logic code specific to researcher
end

Будет только одна таблица "пользователи". И будет один дополнительный столбец (кроме всей электронной почты, имени и т. Д.), Который является столбцом типа. Этот столбец типа указывает, является ли запись исследователем или пользователем.

определить какой-то метод в researchcher.rb, например

def can_fill_form?
  return true
end

и сделать тот же метод в user.rb, как

def can_fill_form?
   return false
end

Делая это, вы просто получаете одну таблицу со всеми пользователями и исследователями. Такие вещи, как электронная почта, телефон, пароль одинаковы, и создание отдельного типа таблицы здесь излишне.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...