繁体   English   中英

使用嵌套的属性表单管理子关系

Managing child relationships with a nested attribute form

提示:本站收集StackOverFlow近2千万问答,支持中英文搜索,鼠标放在语句上弹窗显示对应的参考中文或英文, 本站还提供   中文繁体   英文版本   中英对照 版本,有任何建议请联系yoyou2525@163.com。

我想做的是以下几点:

用户在任何时候都可以拥有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

在用户中,但这似乎很棘手。 理想情况下,大多数这种逻辑都应存在于模型中,但是我所调情的另一件事是使用演示者。

任何想法将不胜感激,如果您需要更多信息作为评论,请告诉我,我将适当地更新此帖子。

2 个回复

也许您应该尝试从用户到个人资料建立两种关系。 一种是他们可以通过您的用户界面进行编辑的控件,另一种是管理员批准的控件。

它可以像这样工作:

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”过滤器)。 批准后,更改将被转储到active_profile中,并显示在某处。

这样,您就可以拥有一个干净的表单界面,并且每当他们再次对其进行编辑时,他们都会看到最新的(但未批准)配置文件。 您还可以使用updated_at列对队列进行排序,以获取“其编辑已应用到未完成的配置文件以供查看并被推送到队列的后面”的功能。

我将通过让用户模型与上述两个配置文件建立关系来解决这个问题。 一个“已批准”配置文件,一个用于编辑的配置文件进入您的管理队列。

但是,为了处理“待处理”配置文件和“已批准”配置文件之间的过渡,我建议可能添加一个状态机来处理过渡。 在最近的项目中,AASM宝石对我很有帮助。 http://github.com/rubyist/aasm/tree/master ),我相信Edge Rails也刚刚推出了State 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,我不认为这是一个hack,我也使用它来更新嵌套的属性,并且可以正常工作。 在这种情况下,虽然您可能不需要,因为您有2个个人资料(一个个人资料,一个待处理)。

只是一个主意! 在这里大声思考!

3 has_one关系的嵌套表单属性

我已经搜查了SO和互联网一段时间了,但是还没弄清楚。 我有一个模型项目,该项目始终只有一个TimerSetting。 不涉及联接表。 在新的项目表单中,我试图使用嵌套属性来创建TimerSetting记录。 无法弄清楚这部分。 模型中的相关代码: 项目模型: Ti ...

4 如何使用子属性(或嵌套属性)

我正在使用Magento构建站点。 我必须使用嵌套/子属性。 magento有可能吗? 我的要求:我有一个属性设置为“艺术风格”,在此属性下有4个属性:1.美术,2.装饰艺术,3.复古艺术,4.摄影。在美术中,我又有以下类别: 。时代b。运动c。国籍我如何实现此目标我的产品已经有类别和 ...

5 如何使用jsf管理表单上的多对多关系

因此,我有以下表格:ocurrencia和persona,它们之间存在多对多关系。 该表称为身份。 我正在使用休眠模式。 这是关于ocurrencia的代码 ; 这是角色上的代码 我尝试在Ocurrencia上使用Fetchtype Lazy,但遇到了一些问题,因 ...

7 Rails使用“接受嵌套属性”和“属于”关系

我的应用中的一些伪代码: 此外: 我有一个使用Wicked gem构建的多步骤向导。 在第一步中,我创建并保存一个项目。 在第二步中,我将视频添加到该项目: 一切正常,但我想在同一步骤中将产品添加到项目的用户。 对于这种情况,我有点困惑,如何接受嵌套属性。 我 ...

8 我可以使用activerecord关系查找嵌套属性吗?

对不起,如果我的问题措辞不好。 我努力表达得很好。 让我们在代码中尝试一下! 我有一个具有has_many项目的客户端模型。 如果我有这样生成的ActiveRecord关系; 并且我想获得属于此关系中返回的客户的所有项目的清单,我将如何处理? 我可以很容易地在Ruby中完成 ...

9 如何对高度嵌套的子组件使用Redux表单?

我最近开始研究react-redux应用程序,遇到了一些复杂的形式,如下所示实现。 我通过创建细化组件来模块化了应用程序。 -- 我想将此表单的整个状态存储在一个Redux中,因为在整个应用程序中,该状态应在后退和前进按钮单击之间保持不变。 我阅读了有关redux-forms和 ...

10 Yii在表单中使用关系属性

在我的Yii应用程序中,我有两个表,分别称为“ producer_offer”和“ book_vegetable”。 我在producer_offer表中有一个名为“ book_vegetable_id”的列,它是“ producer_offer”表的主键列“ id”的外键。 现在,我要 ...

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2021 STACKOOM.COM