【问题标题】:Automatically fill database with a users related model in rails使用 Rails 中的用户相关模型自动填充数据库
【发布时间】:2015-06-12 18:25:59
【问题描述】:

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

  1. 拥有_many用户的Office模型
  2. 属于办公室的用户模型(设计)
  3. 包含多个跟踪器的文件模型
  4. belongs_to 文件和belongs_to 用户的跟踪器模型

我已经能够设置跟踪器和用户之间的关系如下:

跟踪器模型

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 办公室感到困惑,这是该应用程序的主要本质,因为一个文件在办公室之间移动,但为了完整性,我希望用户始终附加到文件中,以防文件丢失,会有人负责。

任何帮助将不胜感激。

【问题讨论】:

  • 你能用每个模型(不仅仅是跟踪器)的关系更新你的帖子吗?正确设置关系后,您应该拥有可用于引用所有相关实体的访问器(例如 User.office)。

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


【解决方案1】:

如果我不理解问题,请告诉我,但您似乎只是想弄清楚如何将Tracker 连接到保存为发件人的current_userOffice Tracker

如果是这种情况,Tracker 不需要存储任何关于UserOffice 的信息,它只需要跟踪User 本身。然后,您可以按照 steve klein 的建议通过 Tracker 引用 Office

@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 有关联的Office 记录,这就会为您提供所需的内容。

【讨论】:

  • 非常感谢,我之前尝试过,但它一直给我错误,我不知道问题出在我的架构上,不知何故它搞砸了,但在检查了你的答案后,我删除了我的数据库并重新运行所有迁移并且它有效。我已经绞尽脑汁好几个小时了,再次感谢。抱歉无法投票,大约 2 小时前才加入
  • 没问题,感谢您选择此作为答案!祝您好运,如果您以后有任何问题,请告诉我。
  • 我已经完成了所有工作,但我想向跟踪器添加一个文件状态字段,当发送者发送文件直到接收者登录以验证他拥有该文件,然后状态更改为已收到。当接收者使用接受按钮登录并且单击它时状态自动更改时,我如何显示通知。感谢您的帮助
【解决方案2】:

我谦虚地建议,基本问题是您的数据没有标准化。您应该使用 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。模型之间关系的性质存储在连接表中,它可以包含关于该关系的尽可能多的信息。使用 accept_nested_attributes_for 构建嵌套表单以自动创建关系。 TrackType 保存 'sender' 和 'receiver' 值。

有几个关于以这种方式使用信息的教程和 railscasts。我刚刚为我正在使用的应用程序设置了它,一旦设置好它就可以很好地工作。

【讨论】:

  • 感谢您的回答,但我还是有点困惑。在 TrackType 模型中,不应该是 has_many :user_trackers。其次,为什么有一个 TrackType 模型,最后你能告诉我 UserTracker 表应该如何包含用户办公室。
  • 已更正。 TrackType 通过调用用户“sender”和“receiver”来存储您放入原始“Tracker”的信息。例如,如果您有一个新的用户类型“cc”或“bcc”或“reviewer”,则在您的方法中,您需要向跟踪器表添加额外的字段。按照我概述的方式,您只需将其他记录添加到“TrackType”表中。用户是“发送者”还是“接收者”使用 track_type_id 存储在连接表中。
  • 谢谢你的回答,我让它按原样工作,但我也会在一个新的 git 分支上尝试你的方式。这将是一种通过关系学习 has_many 的方式。它仍然有点困惑me.Sorry 无法投票,分数不够。非常感谢
  • 不用担心。乐意效劳。 :)
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2017-02-21
  • 1970-01-01
  • 2019-01-29
  • 1970-01-01
  • 1970-01-01
  • 2019-07-01
  • 2022-08-18
相关资源
最近更新 更多