首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >从嵌套模型属性的索引设置位置值

从嵌套模型属性的索引设置位置值
EN

Stack Overflow用户
提问于 2015-06-12 23:04:24
回答 4查看 1K关注 0票数 1

如何在嵌套模型的属性中设置position字段,以便我的has_many关系记住它的排序顺序?

我想从索引中设置位置,以便它反映关系被拖入的顺序。

我有一个带有嵌套字段的表单,它使用带有JQuery排序的cocoon gem,允许每个字段集都是可拖动排序的。

我想在保存表单时更新所有字段的顺序。

EN

回答 4

Stack Overflow用户

发布于 2017-11-23 12:40:50

尝试使用"act_as_list“gem。

代码语言:javascript
复制
class TodoList < ActiveRecord::Base
  has_many :todo_items, -> { order(position: :asc) }
end

class TodoItem < ActiveRecord::Base
  belongs_to :todo_list
  acts_as_list scope: :todo_list
end

todo_list = TodoList.find(...)
todo_list.todo_items.first.move_to_bottom
todo_list.todo_items.last.move_higher

参考:https://github.com/swanandp/acts_as_list

票数 1
EN

Stack Overflow用户

发布于 2015-06-12 23:30:48

如果您已经设置了标准的CRUD/restful路由和控制器操作,那么您所要做的就是在嵌套类的一个实例上调用"update_attributes(:position => 3)“(在本例中是教育类)。

更新嵌套在“简历”下的教育的通常方法是

代码语言:javascript
复制
UPDATE  /resumes/123/educations/456

因此,您将对此url进行一次ajax调用。" update“方法并不是真正的update方法,它是通过传递参数"_method" = "UPDATE"来欺骗的,所以您的ajax调用也需要包含这个参数。

因此,基本上,在“完成拖动”事件中,您将对此url进行一个ajax调用。

代码语言:javascript
复制
"/resumes/<%= @resume.id %>/educations/<%= education.id %>"

并像这样传递数据

代码语言:javascript
复制
{"_method": "UPDATE", "education[position]": <new position>}

这应该会更新教育对象的位置。

另一个遗留问题是,使用acts_as_list时,当我们更改一个项目的位置时,我们希望其他项目也自动调整它们的位置。我不确定acts_as_list是否会自动执行此操作。试试看。

票数 0
EN

Stack Overflow用户

发布于 2015-06-12 23:51:55

好的,非ajaxy版本。

假设您的表单是一个form_for @resume,这意味着它将调用resumes#create或resumes#update操作。

如果列表中的所有education行都有一个隐藏字段,如下所示

代码语言:javascript
复制
<%= hidden_field_tag "resume[education_ids][]", education.id %>

然后,当表单提交时,它们将进入params:resume 中的数组,按照表单提交时它们在页面中出现的顺序恢复,这就是您想要的。

关联为您提供了设置器方法Resume#education_ids,允许您以这种方式按顺序设置关联。

也就是说,你的更新操作(如果它是一个普通的更新操作)会说这样的话

代码语言:javascript
复制
@resume = Resume.find_by_id(params[:id])
if @resume.update_attributes(params[:resume])
  ...

在这种情况下,这将说明

代码语言:javascript
复制
@resume.update_attributes(:education_ids => [5,6,2,1])

这就像是说“将我的教育设置为ids为5、6、2、1的教育,按此顺序。

注意:在我的rails版本中(这可能会在后续版本中得到修复),如果您使用此_ids方法,并且它已经具有关联,但顺序不同,它将不会对它们进行重新排序。试一试,看看会发生什么。

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/30806334

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档