使用rails中的用户相关模型自动填充数据库

时间:2015-06-12 18:25:59

标签: ruby-on-rails ruby-on-rails-4

我刚开始在rails上学习ruby,我的第一个应用程序是一个办公文件跟踪系统,它有4个模型

  1. has_many用户的办公模型
  2. belongs_to office
  3. 的用户模型(设计)
  4. has_many跟踪器的文件模型
  5. 属于文件和belongs_to用户的跟踪器模型
  6. 我已经能够设置跟踪器和用户之间的关系,如下所示:

    跟踪器模型

    class Tracker < ActiveRecord::Base
      belongs_to :nasfile
      belongs_to :sender, :foreign_key => :sender_id, class_name: 'User' 
      belongs_to :receiver, :foreign_key => :receiver_id, class_name: 'User'
    end
    

    用户模型

    class User < ActiveRecord::Base
      # Include default devise modules. Others available are:
      # :confirmable, :lockable, :timeoutable and :omniauthable,:recoverable
      devise :database_authenticatable, :registerable,
             :rememberable, :trackable, :validatable,
             :authentication_keys => [:username], password_length: 6..25
    
      belongs_to :office
      accepts_nested_attributes_for :office
    
      has_many :sent_files,:class_name => 'Tracker', :foreign_key => 'sender_id'
      has_many :received_files,:class_name => 'Tracker', :foreign_key => 'recepient_id'
    
      def email_required?
        false
      end
    
      def email_changed?
        false
      end
    
    end
    

    办公室模式

    class Office < ActiveRecord::Base
      belongs_to :department
    
      has_many :users
    end
    

    自动填充在跟踪器控制器中的创建操作中发送文件的用户

    def create
        @tracker = Tracker.new(tracker_params)
    
        @tracker.sender_id = current_user.id
        respond_to do |format|
          if @tracker.save
            format.html { redirect_to @tracker, notice: 'Tracker was successfully created.' }
            format.json { render :show, status: :created, location: @tracker }
          else
            format.html { render :new }
            format.json { render json: @tracker.errors, status: :unprocessable_entity }
          end
        end
      end
    

    在我的索引视图中显示它

    <tbody>
        <% @trackers.each do |tracker| %>
          <tr>
            <td><%= tracker.nasfile %></td>
            <td><%= tracker.sender.username if tracker.sender.present? %></td>
            <td><%= tracker.receiver_id %></td>
            <td><%= link_to 'Show', tracker %></td>
            <td><%= link_to 'Edit', edit_tracker_path(tracker) %></td>
            <td><%= link_to 'Destroy', tracker, method: :delete, data: { confirm: 'Are you sure?' } %></td>
          </tr>
        <% end %>
      </tbody>
    

    我现在面临的主要问题是,我对如何设置跟踪器与用户所属办公室之间的关系感到困惑,以便自动填写current_users办公室,这是应用程序的主要精髓,因为文件在办公室之间移动,但我希望用户始终附加到文件以保证完整性,以防文件丢失,将有人负责。

    任何帮助都将受到高度赞赏。

2 个答案:

答案 0 :(得分:0)

我谦卑地建议基本问题是你的数据没有规范化。您应该使用has_many through关系为用户创建跟踪器。

这样的事情:

class Tracker < ActiveRecord::Base
  has_many :user_trackers
  has_many :users, through => :user_trackers, :dependent => :destroy

  accepts_nested_attributes_for :user_trackers
end

class UserTracker < ActiveRecord::Base
  belongs_to :user
  belongs_to :tracker
  belongs_to :tracker_type
end

class TrackerType < ActiveRecord::Base
  has_many :user_trackers
end

class User < ActiveRecord::Base
  has_many :user_trackers
  has_many :trackers, through => :user_trackers, :dependent => :destroy

  accepts_nested_attributes_for :user_trackers
end

连接表UserTracker具有user_id,tracker_id和tracker_type_id字段。如果这是关系的一部分,您也可以添加file_id。模型之间关系的性质存储在连接表中,连接表可以包含有关该关系的所需信息。构建嵌套表单,使用accepts_nested_attributes_for自动神奇地创建关系。 TrackType保存“发送者”和“接收者”值。

有几种关于以这种方式使用信息的教程和轨道广播。我刚刚为我正在使用的应用程序设置它,并且一旦你完成所有设置它就能很好地工作。

答案 1 :(得分:0)

如果我不理解这个问题,请告诉我,但您似乎只想弄清楚如何将TrackerOffice的{​​{1}}联系起来被保存为current_user上的发件人。

如果是这种情况,则Tracker无需存储有关Tracker User的任何信息,只需跟踪Office本身。然后,您可以通过User引用Office作为steve klein建议。

Tracker

@tracker.sender.office

甚至更好(如果你将名字委托给办公室):

@tracker.sender.office.name 

这将为您提供办公室的名称(如果@tracker.sender.office_name class User < ActiveRecord::Base # Include default devise... ... delegate :name, to: :office, prefix: true end 存在)。只要.name具有关联的User记录,就可以获得所需内容。