- 浏览: 410066 次
- 性别:
- 来自: 北京
文章分类
最新评论
-
冯大圆__渐成胡子渣:
写得很详细,想请求一下,bundler install的时候设 ...
Rails Assets Pipeline -
DaSunWarman:
...
#!/usr/bin/env 脚本解释程序的作用 -
alexag:
...
javascript立即执行函数与函数声明和函数表达式 -
houxm:
你也可以使用更简单的方式(只要在元素上添加 data-togg ...
bootstrap 小tip -
jaycongwen:
帮我看看啊,我刚学wen@wen-desktop:~$ cd ...
cannot load such file -- openssl
通过嵌套属性(nested attribute),你可以通过parent来保存与其相关联的属性。默认情况下,嵌套属性是关闭的,你可以开启accepts_nested_attributes_for这个类方法,就在该model上生成一个属性writer。
属性writer是以该关联命名。例如,为你的model增加两个新方法:
author_attributes=(attributes) 和 pages_attributes=(attributes).
class Book < ActiveRecord::Base
has_one :author
has_many :pages
accepts_nested_attributes_for :author, :pages
end
使用了accepts_nested_attributes_for的每一个关联都自动开启:autosave
一对一关联
一个Member有一个Avatar(化身):
class Member < ActiveRecord::Base
has_one :avatar
accepts_nested_attributes_for :avatar
end
开启一对一关联的嵌套属性可以通过这样方法一次性创建Member:
params = { :member => { :name => 'Jack', :avatar_attributes => { :icon => 'smiling' } } }
member = Member.create(params[:member])
member.avatar.id # => 2
member.avatar.icon # => 'smiling'
也可以这样update avatar
params = { :member => { :avatar_attributes => { :id => '2', :icon => 'sad' } } }
member.update_attributes params[:member]
member.avatar.icon # => 'sad'
默认情况下你只能设置或更新关联的model。如果你想通过属性hash来删除关联model,你需要使用:allow_destroy 选项
class Member < ActiveRecord::Base
has_one :avatar
accepts_nested_attributes_for :avatar, :allow_destroy => true
end
此时,如果向属性hash里增加一个_destroy的key,并且value是true,则该关联model将被删除:
member.avatar_attributes = { :id => '2', :_destroy => '1' }
member.avatar.marked_for_destruction? # => true
member.save
member.reload.avatar # => nil
注意这里,只有当parent被保存后,关联的model才真正被删除。
--------------------------------------------------------------------
一对多关联
一个member有一些post
class Member < ActiveRecord::Base
has_many :posts
accepts_nested_attributes_for :posts
end
你可通过属性hash来增加或更新关联post model
每一个不含有id键的新记录会被实例化,除非该hash也包含了一个 :_destroy => true
params = {
:member => {
:name => 'joe', :posts_attributes => [
{ :title => 'Kari, the awesome Ruby documentation browser!' },
{ :title => 'The egalitarian assumption of the modern citizen'},
{ :title => '', :_destroy => '1' } # 该记录会被忽略
]
}
}
member = Member.create(params['member'])
member.posts.length # => 2
member.posts.first.title # => 'Kari, the awesome Ruby documentation browser!'
member.posts.second.title # => 'The egalitarian assumption of the modern citizen'
通过 :reject_if proc 设置忽略的不满足条件的记录。例如:
class Member < ActiveRecord::Base
has_many :posts
accepts_nested_attributes_for :posts,
:reject_if => proc { |attributes| attributes['title'].blank? }
end
params = { :member => {
:name => 'joe', :posts_attributes => [
{ :title => 'Kari, the awesome Ruby documentation browser!' },
{ :title => 'The egalitarian assumption of the modern citizen' },
{ :title => '' } # 这个记录会被忽略
]
}
}
member = Member.create(params['member'])
member.posts.length # => 2
member.posts.first.title # => 'Kari, the awesome Ruby documentation browser!'
member.posts.second.title # => 'The egalitarian assumption of the modern citizen'
:reject_if 也可一接受一个symbol来代表一个可用方法:
如果hash中含有一个id和已有的关联记录相匹配,则被匹配到的记录会被修改:
member.attributes = {
:name => 'Joe',
:posts_attributes => [
{ :id => 1, :title => '[UPDATED] An, as of yet, undisclosed awesome Ruby documentation browser!' },
{ :id => 2, :title => '[UPDATED] other post' }
]
}
member.posts.first.title # => '[UPDATED] An, as of yet, undisclosed awesome Ruby documentation browser!'
member.posts.second.title # => '[UPDATED] other post'
默认关联记录是被保护的(不被删除)。如果想通过属性hash来删除任何关联记录,你需要打开:allow_destroy选项, 这样使用_destroy键来删除记录就行:
class Member < ActiveRecord::Base
has_many :posts
accepts_nested_attributes_for :posts, :allow_destroy => true
end
params = { :member => {
:posts_attributes => [{ :id => '2', :_destroy => '1' }]
}
}
member.attributes = params['member']
member.posts.detect { |p| p.id == 2 }.marked_for_destruction? # => true 标记将被删除
member.posts.length # => 2 未保存,所以还没删除
member.save
member.reload.posts.length # => 1
----------------------------------------------------------------------
使用attr_accessible
使用attr_accessible如果不小心,可能会干扰到嵌套属性的使用。例如,上述member model如下使用attr_accessible:
attr_accessible :name
你需要这样的修改:
attr_accessible :name, :posts_attributes
验证parent model 的存在
如果你想验证一个child记录是否和一个parent记录关联,你可以使用validates_presence_of和inverse_of:
class Member < ActiveRecord::Base
has_many :posts, :inverse_of => :member
accepts_nested_attributes_for :posts
end
class Post < ActiveRecord::Base
belongs_to :member, :inverse_of => :posts
validates_presence_of :member
end
属性writer是以该关联命名。例如,为你的model增加两个新方法:
author_attributes=(attributes) 和 pages_attributes=(attributes).
class Book < ActiveRecord::Base
has_one :author
has_many :pages
accepts_nested_attributes_for :author, :pages
end
使用了accepts_nested_attributes_for的每一个关联都自动开启:autosave
一对一关联
一个Member有一个Avatar(化身):
class Member < ActiveRecord::Base
has_one :avatar
accepts_nested_attributes_for :avatar
end
开启一对一关联的嵌套属性可以通过这样方法一次性创建Member:
params = { :member => { :name => 'Jack', :avatar_attributes => { :icon => 'smiling' } } }
member = Member.create(params[:member])
member.avatar.id # => 2
member.avatar.icon # => 'smiling'
也可以这样update avatar
params = { :member => { :avatar_attributes => { :id => '2', :icon => 'sad' } } }
member.update_attributes params[:member]
member.avatar.icon # => 'sad'
默认情况下你只能设置或更新关联的model。如果你想通过属性hash来删除关联model,你需要使用:allow_destroy 选项
class Member < ActiveRecord::Base
has_one :avatar
accepts_nested_attributes_for :avatar, :allow_destroy => true
end
此时,如果向属性hash里增加一个_destroy的key,并且value是true,则该关联model将被删除:
member.avatar_attributes = { :id => '2', :_destroy => '1' }
member.avatar.marked_for_destruction? # => true
member.save
member.reload.avatar # => nil
注意这里,只有当parent被保存后,关联的model才真正被删除。
--------------------------------------------------------------------
一对多关联
一个member有一些post
class Member < ActiveRecord::Base
has_many :posts
accepts_nested_attributes_for :posts
end
你可通过属性hash来增加或更新关联post model
每一个不含有id键的新记录会被实例化,除非该hash也包含了一个 :_destroy => true
params = {
:member => {
:name => 'joe', :posts_attributes => [
{ :title => 'Kari, the awesome Ruby documentation browser!' },
{ :title => 'The egalitarian assumption of the modern citizen'},
{ :title => '', :_destroy => '1' } # 该记录会被忽略
]
}
}
member = Member.create(params['member'])
member.posts.length # => 2
member.posts.first.title # => 'Kari, the awesome Ruby documentation browser!'
member.posts.second.title # => 'The egalitarian assumption of the modern citizen'
通过 :reject_if proc 设置忽略的不满足条件的记录。例如:
class Member < ActiveRecord::Base
has_many :posts
accepts_nested_attributes_for :posts,
:reject_if => proc { |attributes| attributes['title'].blank? }
end
params = { :member => {
:name => 'joe', :posts_attributes => [
{ :title => 'Kari, the awesome Ruby documentation browser!' },
{ :title => 'The egalitarian assumption of the modern citizen' },
{ :title => '' } # 这个记录会被忽略
]
}
}
member = Member.create(params['member'])
member.posts.length # => 2
member.posts.first.title # => 'Kari, the awesome Ruby documentation browser!'
member.posts.second.title # => 'The egalitarian assumption of the modern citizen'
:reject_if 也可一接受一个symbol来代表一个可用方法:
如果hash中含有一个id和已有的关联记录相匹配,则被匹配到的记录会被修改:
member.attributes = {
:name => 'Joe',
:posts_attributes => [
{ :id => 1, :title => '[UPDATED] An, as of yet, undisclosed awesome Ruby documentation browser!' },
{ :id => 2, :title => '[UPDATED] other post' }
]
}
member.posts.first.title # => '[UPDATED] An, as of yet, undisclosed awesome Ruby documentation browser!'
member.posts.second.title # => '[UPDATED] other post'
默认关联记录是被保护的(不被删除)。如果想通过属性hash来删除任何关联记录,你需要打开:allow_destroy选项, 这样使用_destroy键来删除记录就行:
class Member < ActiveRecord::Base
has_many :posts
accepts_nested_attributes_for :posts, :allow_destroy => true
end
params = { :member => {
:posts_attributes => [{ :id => '2', :_destroy => '1' }]
}
}
member.attributes = params['member']
member.posts.detect { |p| p.id == 2 }.marked_for_destruction? # => true 标记将被删除
member.posts.length # => 2 未保存,所以还没删除
member.save
member.reload.posts.length # => 1
----------------------------------------------------------------------
使用attr_accessible
使用attr_accessible如果不小心,可能会干扰到嵌套属性的使用。例如,上述member model如下使用attr_accessible:
attr_accessible :name
你需要这样的修改:
attr_accessible :name, :posts_attributes
验证parent model 的存在
如果你想验证一个child记录是否和一个parent记录关联,你可以使用validates_presence_of和inverse_of:
class Member < ActiveRecord::Base
has_many :posts, :inverse_of => :member
accepts_nested_attributes_for :posts
end
class Post < ActiveRecord::Base
belongs_to :member, :inverse_of => :posts
validates_presence_of :member
end
发表评论
-
ruby module :: 前置操作符
2014-04-02 16:55 747在ruby代码中,我们经常看到有类似这样的获取module的用 ... -
关于Ruby动态方法定义的区别
2014-04-02 16:05 863A.class_eval(<<-EOF, __ ... -
%Q, %q, %W, %w, %x, %r, %s
2014-04-02 10:52 1066%Q 遇到引号嵌套的时候我们往往需要使用反斜线来实现转义,使用 ... -
Ruby extend self
2013-10-22 10:14 991我们想让实例方法同时为类方法,那么可以使用extend sel ... -
$:.unshift File.expand_path('..', __FILE__)
2013-10-22 10:05 1324一直能看到一些gem里面会有这样一句代码: $:.unshif ... -
rails cattr_accessor and mattr_accessor
2013-09-27 09:37 0http://stackoverflow.com/questi ... -
Rails、Nginx、Passenger、bundle,这几者是怎么协作的?
2013-06-27 00:33 1129注:本文转自知乎,原文请参考 Bundle是Gem包的依赖管 ... -
bundle open a specify gem
2013-06-26 23:48 1026今天在看railscasts教程http://railscas ... -
关于测试
2013-06-25 00:52 725http://asciicasts.com/episodes/ ... -
Rails高级编程 笔记
2013-04-23 18:00 0Ruby基础 1、类:主要负责封装和分离事物 2 ... -
ruby通用符号
2013-04-10 22:34 0%Q 当你在”字符串中” 有大量的使用双引号时,频繁的转义字符 ... -
rails_client_validations
2013-02-22 10:57 919看了下rails的服务端验证怎样转换到客户端,实现类似于aja ... -
rails Authration and Password
2013-02-19 18:23 1009以下是我总结的在rails项目中用到的与登录注册相关的资源: ... -
Rails Assets Pipeline
2013-02-03 18:03 7408Assets Pipeline 有什么好处 ... -
deployment RoR with nginx & unicorn on ubuntu
2013-01-09 14:50 1858本来一直都是用rails自带的webrick做本地开发的,但是 ... -
rails attr_protected、 attr_accessible
2013-01-06 10:02 1041attr_protected、 attr_accessible ... -
NewRelic
2013-01-04 17:52 6332NewRelic是一家提供Rails性能监测服务的网站, Ne ... -
rails中处理北京时间以及数据库的时区问题
2012-10-10 11:18 0解释4个时区设置的不同: config.active_rec ... -
eigenclass 与 class 关系
2012-09-20 16:24 1118声明:本文转载自http://ruanwz.github.co ... -
单例模块儿
2012-09-11 17:01 944#单例模块,存在的意义就是在模块被载入类时,给类添加类方法和创 ...
相关推荐
Laravel开发-eloquent-nested-attributes 嵌套属性允许您通过父级保存关联记录的属性。默认情况下,嵌套属性更新被关闭,您可以使用$nested属性启用它。启用嵌套属性时,将在模型上定义属性编写器。
在本案例中,我们关注的是Spring中的Nested事务,这是一个相对复杂的特性,但非常有用,特别是在需要子事务处理的场景下。下面将详细解释这个概念。 Nested事务是基于JDBC的Savepoint机制实现的,它可以让我们在一...
标题和描述均提到了“Weblogic9异常解决nested errors”,这指向了在使用WebLogic Server 9版本时可能遇到的特定错误处理问题。WebLogic Server是Oracle公司提供的一款功能强大的应用服务器,它支持多种标准协议,如...
《深入理解BetterNestedSet:acts_as_nested_set的增强版》 在Ruby on Rails开发中,数据结构的选择对于数据库操作的效率至关重要。其中,Nested Set模型是一种常用的数据组织方式,尤其适用于管理具有层级关系的...
它支持多种高级数据结构,其中就包括嵌套表(Nested Table)。嵌套表是一种特殊类型的集合类型,允许在一个列中存储一组行,这些行可以是同一种类型的数据。本示例“Oracle Nested Table Demo”将向我们展示如何在...
这就是Laravel Nestedset派上用场的地方。Nestedset是一种高效的存储和操作具有层级关系的数据模式,它允许我们进行快速的查询和便捷的操作,如插入、删除和移动节点。 Laravel Nestedset库,如`laravel-nestedset`...
安装将此行添加到您的应用程序的Gemfile中: gem 'nested_record' 然后执行: $ bundle或将其自己安装为: $ gem install nested_record用法使用nested_record通过JSON属性在ActiveRecord模型上定义嵌套的关联。...
"laravel-nested"很可能是一个用于在Laravel中实现嵌套集合(Nested Set)模型的库或者教程。嵌套集合是一种常用的数据结构,特别适合表示具有层级关系的数据,比如目录结构、组织架构等。 在Laravel中,我们通常...
基于Nested Logit模型的出行路线方式选择和时间价值计算,宗芳,祁文田,本文介绍了Nested Logit模型的效用最大化理论、选择树的建立以及其概率表达式;时间价值的基本计算公式。对人们由长春到吉林的出行路
"Nested Model"(嵌套模型)是处理层级数据的一种高效且灵活的方法,通常用于表示具有父子关系的数据,比如组织架构、分类目录等。在本篇博文中,我们将探讨这种模型以及如何在实际应用中利用它。 嵌套模型的核心...
在React Native开发中,我们经常会遇到需要在一个组件中嵌套多个可滚动视图的情况,这时`react-native-nested-scroll-view`就派上用场了。它是一个针对Android平台的NestedScrollView的React Native封装,旨在解决...
sqlitejdbc-v037-nested.jar
nested exception is java.lang.NoClassDefFoundError_kmode exception" 指出的问题,是Java开发中常见的错误,通常发生在运行时。这个错误表明系统在尝试执行某个类时找不到对应的类定义。`NoClassDefFoundError` ...
We develop a new edge detection algorithm, holistically-nested edge detection (HED), which performs image-to-image prediction by means of a deep learning model that leverages fully convolutional ...
为了解决这一性能瓶颈问题,研究者们提出了一种新的技术,即NEVE(Nested Virtualization Extensions for ARM)。NEVE通过一系列简化的架构改变,允许软件合并和延迟陷阱处理,即通过记录hypervisor指令的结果,直到...
Java程序在运行过程中可能会遇到各种异常,其中"nested exception is java.lang.OutOfMemoryError: Java heap space"是一个常见的问题,通常发生在程序试图分配超过堆内存限制的空间时。这个错误表明Java虚拟机(JVM...
JSON(JavaScript Object Notation)是一种轻量级的数据交换格式,被广泛用于Web应用程序之间传递数据。在Android开发中,Gson库是Google提供的一个强大的工具,它能够方便地将Java对象转换为JSON字符串,以及将JSON...
yii2-nested-sets, Yii框架的嵌套集行为 nest 2的行为 一种利用改进的预排序树遍历算法的Yii框架的现代嵌套。安装安装这个扩展的首选方法是通过 composer插件。运行$ composer require creocoder/yii2-nes
Please use the , vue-draggable-nested-tree will no longer be maintained. 请使用新发布的, vue-draggable-nested-tree 将不再维护. Please use the , vue-draggable-nested-tree will no longer be maintained. ...
从accepts_nested_attributes_for助手中释放您的模型。 Active Form 提供了一种面向对象的方法来通过构建表单对象来表示您的表单,而不是依赖 Active Record 内部来执行此操作。 表单对象提供了一个 API 来描述表单...