我刚开始在rails上学习ruby,我的第一个应用程序是一个办公文件跟踪系统,它有4个模型
我已经能够设置跟踪器和用户之间的关系,如下所示:
跟踪器模型
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办公室,这是应用程序的主要精髓,因为文件在办公室之间移动,但我希望用户始终附加到文件以保证完整性,以防文件丢失,将有人负责。
任何帮助都将受到高度赞赏。
答案 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)
如果我不理解这个问题,请告诉我,但您似乎只想弄清楚如何将Tracker
与Office
的{{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
记录,就可以获得所需内容。