管理孩子的关系与嵌套表格属性
-
11-09-2019 - |
题
我试图做的是以下内容:
目前任何时间,用户可以有1个有效简表。此活动的配置文件必须由管理员有权确保它符合规则和网站的规则。当用户编辑个人资料公开个人资料不会受到影响,直到管理员签署了他们的变化。如果它们进行编辑,而他们的个人资料正在审查中,他们的编辑适用于优秀的个人资料进行审核,并被推到了队列的后面。
我的模型看起来是这样的:
class Profile < AR:B
belongs_to :user
end
class User < AR:B
has_many :profiles do
def active
...
end
def latest
end
end
def profile
self.profiles.active
end
end
有一个小搓......用户不应该能够直接编辑配置文件,为配置文件收集不被暴露。相反,他们编辑他们的用户和配置文件字段被示出在那里。
什么是管理最好的方法?目前我使用:
accepts_nested_attributes_for :profiles
在用户,但似乎相当哈克。理想的情况是大多数这种逻辑的将住在模型中,但我与调情的另一件事是使用一个主持人。
任何想法,将不胜感激,让我知道如果你需要更多的信息,作为一个评论,我会适当地更新这个帖子。
解决方案
也许你应该尝试有来自用户的两个关系来分析。一是他们可以通过用户界面编辑之一,另一种是由管理员批准的一个。
它可以工作是这样的:
class User < AB:B
has_one :profile #the user-editable one one
has_one :active_profile, :class_name=>"profile" #the one shown
end
通过窗体上的用户简档的每个变化将随后示出了用于管理(使用和观察者或者只是与“after_save的”过滤器)。当它aproves它,这些更改然后倾倒到active_profile之一,并某处所示。
这样的话,你可以有一个干净的接口形式,每当他们再次编辑,他们看到最新的(但不获批准)的个人资料。还可以使用的updated_at柱获得对“其编辑被施加到突出的轮廓进行审查和被推到队列的后面”的funcionality命令队列中。
其他提示
我去对此通过使用户模型具有两个轮廓的关系如上所建议的为好。一个“批准”的个人资料,以及一个用于编辑进入您的管理员队列。
然而,为了“等待”配置文件和“批准”配置文件我建议在一国机可能增加处理转换之间处理的转变。该AASM宝石已经在最近的一个项目已经为我好。 ( http://github.com/rubyist/aasm/tree/master ),我相信边缘轨道在刚刚出炉的国家Machinage权为好。 ( http://github.com/rails/rails/commit/aad5a30bf25d8a3167afd685fc91c99f4f09cc57 )
您模型可以是这个样子:
class User < AR:B
has_one :active_profile
has_one :pending_profile
include ActiveRecord:: StateMachine
state_machine do
state :approved
state :pending
state :rejected
event :update_profile_pending do
transitions :to => :pending, :from => [:approved], :on_transition => :send_to_admin_queue
end
event :update_profile_approved do
transitions :to => :approved, :from => [:pending], :on_transition => :update_current_profile
end
event :update_to_rejected do
transitions :to => :rejected, :from => [:pending]
end
end
def send_to_admin_queue
//method to handlesending pending profiles to admin for approval
end
def update_current_profile
//method to handle updated profiles with changes
end
end
您可以再调用User.update轮廓待定!或User.update轮廓批准!和信息状态之间转变使用过渡回调处理活动配置文件和待处理轮廓之间发送的编辑数据。
至于使用nested_attributes_for与您的实际形式,我不认为这是一个黑客,我使用它,以及更新嵌套的属性,它会正常工作。在这种情况下,尽管你可能不需要太多,因为你有两个配置文件(一个公共的,一个申请中)。
只是一个想法!这里大声思考了!