polymorphic-associations 多态关联实例 ruby on rails
这次做新项目的时候,把图片都放在了一个表里,其他表中不再存图片信息,通过多态关联建立表之间的关系。
(1)新建picture表, component表不需要处理
class CreatePictures < ActiveRecord::Migration[5.0]
def change
create_table :pictures do |t|
t.integer :imageable_id
t.string :imageable_type
t.string :name
t.string :md5
t.string :url
t.timestamps
end add_index :pictures, [:imageable_type, :imageable_id]
end
end
(2)关于model的关联
多态关联的文档 http://guides.rubyonrails.org/association_basics.html#polymorphic-associations
A slightly more advanced twist on associations is the polymorphic association.
With polymorphic associations, a model can belong to more than one other model, on a single association.
For example, you might have a picture model that belongs to either an employee model or a product model.
Here's how this could be declared:
class Component < ApplicationRecord
serialize :hints, Hash has_many :pictures, as: :imageable
accepts_nested_attributes_for :pictures, reject_if: proc { |attributes| attributes['md5'].blank? || attributes['url'].blank? }
end
class Picture < ApplicationRecord
belongs_to :imageable, polymorphic: true end
对下拉框的处理
PICTURE_NAME = {
'海报图' => 'poster',
'背景' => 'background',
'左下角角标' => 'left_bottom_corner',
'右下角角标' => 'right_bottom_corner',
'左上角角标' => 'left_top_corner',
'右上角角标' => 'right_top_corner'
}
def picture_name picture_name
PICTURE_NAME.invert[picture_name]
end
关于多态关联的Instance Public methods: http://api.rubyonrails.org/
Defines an attributes writer for the specified association(s).
Supported options:
- :allow_destroy
-
If true, destroys any members from the attributes hash with a
_destroykey and a value that evaluates totrue(eg. 1, '1', true, or 'true'). This option is off by default. - :reject_if
-
Allows you to specify a Proc or a Symbol pointing to a method that checks whether a record should be built for a certain attribute hash.
The hash is passed to the supplied Proc or the method and it should return either
trueorfalse. When no:reject_ifis specified,a record will be built for all attribute hashes that do not have a
_destroyvalue that evaluates to true.Passing
:all_blankinstead of a Proc will create a proc that will reject a record where all the attributes are blank excluding any value for_destroy. - :limit
-
Allows you to specify the maximum number of associated records that can be processed with the nested attributes.
Limit also can be specified as a Proc or a Symbol pointing to a method that should return a number.
If the size of the nested attributes array exceeds the specified limit, NestedAttributes::TooManyRecordsexception is raised.
If omitted, any number of associations can be processed.
Note that the
:limitoption is only applicable to one-to-many associations. - :update_only
-
For a one-to-one association, this option allows you to specify how nested attributes are going to be used when an associated record already exists.
In general, an existing record may either be updated with the new set of attribute values or be replaced by a wholly new record containing those values.
By default the
:update_onlyoption isfalseand the nested attributes are used to update the existing record only if they include the record's:idvalue.Otherwise a new record will be instantiated and used to replace the existing one.
However if the
:update_onlyoption istrue, the nested attributes are used to update the record's attributes always,regardless of whether the
:idis present. The option is ignored for collection associations.
Examples:
# creates avatar_attributes=
accepts_nested_attributes_for :avatar, reject_if: proc { |attributes| attributes['name'].blank? }
# creates avatar_attributes=
accepts_nested_attributes_for :avatar, reject_if: :all_blank
# creates avatar_attributes= and posts_attributes=
accepts_nested_attributes_for :avatar, :posts, allow_destroy: true
http://api.rubyonrails.org/classes/ActiveRecord/NestedAttributes/ClassMethods.htmlIf the hash contains an id key that matches an already associated record, the matching record will be modified:
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'
(3)controller里的处理
Nested Parameters
http://guides.rubyonrails.org/action_controller_overview.html#strong-parameters
private
def set_component
@component = Component.find(params[:id])
end def component_params
params.require(:component).permit(:release_id,
:unitary, {pictures_attributes: [:id, :imageable_type, :imageable_id, :name, :url, :md5]},
:remark, component_ids: [], hints: [:left, :mid, :right]
)
end
(4)_form里的处理
<div class="image-group">
<% @component.pictures.each do |p| %>
<%= hidden_field_tag 'component[pictures_attributes][][id]', p.id %>
<div class="form-group">
<%= f.label 'name', class: 'col-sm-2 control-label' %>
<div class="col-sm-4">
<%= text_field_tag 'component[pictures_attributes][][name]', @component.picture_name(p.name), class: 'form-control' %>
</div>
</div> <div class="form-group">
<%= f.label 'md5', class: 'col-sm-2 control-label' %>
<div class="col-sm-4">
<%= text_field_tag 'component[pictures_attributes][][md5]', p.md5, class: 'form-control' %>
</div>
</div> <div class="form-group">
<%= f.label 'url', class: 'col-sm-2 control-label' %>
<div class="col-sm-4">
<%= image_tag p.url, :width => 300 %><br/>
</div>
<div class="col-sm-4">
<%= text_field_tag 'component[pictures_attributes][][url]', p.url, class: 'form-control' %>
</div>
</div>
<% end %>
</div>
polymorphic-associations 多态关联实例 ruby on rails的更多相关文章
- Windows下: RubyMine + Ruby On Rails + mysql 搭建开发环境
最近在接手一个手机项目.在搭建环境的过程中,遇到了一些问题,在下文中已做记录,并奉上个人的解决方案. 开发环境 win2003 ; JetBrains RubyMine6.3.3 1. 下载最新版 ...
- [ruby on rails] 跟我学之(8)修改数据
修改views 修改index视图(app/views/posts/index.html.erb),添加编辑链接,如下: <h1>Our blogs</h1> <% @p ...
- [ruby on rails] 跟我学之(3)基于rails console的查增删改操作
本章节展开对model的介绍:包括查增删改操作.紧接着上面一节<[ruby on rails] 跟我学之HelloWorld> 创建模型 使用命令创建模型 创建表post,默认自带两栏位 ...
- [Ruby on Rails系列]6、一个简单的暗语生成器与解释器(上)
[0]Ruby on Rails 系列回顾 [Ruby on Rails系列]1.开发环境准备:Vmware和Linux的安装 [Ruby on Rails系列]2.开发环境准备:Ruby on Ra ...
- laravel的多态关联--morphTo和morphMany
首先,文档里面讲述的不是特别详细,详细寻找查询流程没有过多介绍,只是介绍如何去定义,直接使用,导致很多该明白的东西,没有说明,下面详细看看这个多态关联 是怎么定义,使用,详细查询的. 先看文档介绍 多 ...
- Ruby on Rails 實戰聖經阅读(三)
由于是1.8.x:圣经的1.9.3差太多,所以另外按1.8.X来创建hello world 第一個Hello World!! 1. 创建项目rails -d mysql first 2.创建控制器 ...
- [技术博客] 软工-Ruby on Rails 后端开发总结分享
[技术博客] 软工-Ruby on Rails 后端开发总结分享 在这次软件编写中,我们的后端使用了Ruby on Rails (RoR)框架. Rails框架是用Ruby编写的.这意味着当我们为Ru ...
- Linux超快速安装Ruby on Rails
Linux超快速安装Ruby on Rails 时间 2014-11-25 11:45:11 Flincllck Talk 原文 http://www.flincllck.com/quick-ins ...
- 管理不同版本ruby和rails的利器——rvm
近年来,ruby on rails逐渐火了起来,我想各位码农早就耳闻,特别是那些做B/S项目的童鞋,早就想跃跃一试了. 笔者也是初次接触ruby on rails ,我想,对于初学者来说,最好的学习方 ...
随机推荐
- uC/OS-II队列(OS_q)块
/*************************************************************************************************** ...
- MySQL下全文索引
一种特殊的索引,它会把某个数据表的某个数据列出现过的所有单词生成一份清单. alter table tablename add fulltext(column1,column2) 只能在MyISAM数 ...
- myeclipse 破解步骤
Fllow Orders.0. Close MyEclipse Application(if you wanna replace jar file).1. Fill usercode2. Fill s ...
- Python学习笔记——文件写入和读取
1.文件写入 #coding:utf-8 #!/usr/bin/env python 'makeTextPyhton.py -- create text file' import os ls = os ...
- Java数据库——ResultSet接口
使用SQL中的SELECT语句可以查询出数据库的全部结果,在JDBC的操作中数据库的所有查询记录将使用ResultSet进行接收,并使用ResultSet显示内容. 从user表中查询数据 //=== ...
- hasClass addClass removeClass
//函数有class function hasClass(ele,cls){ return -1<(" "+ele.className+" ").inde ...
- asp.net 中的app_offline.htm的使用
前段时间,系统升级,由于系统更新发布时间较长,所以必须停掉站点进行更新.导致很多用户都来反馈系统无法访问,还认为站点被黑掉了. 所以经过那件事我们也在思考,如何做到不停机,进行热部署.单机环境下(双机 ...
- SHIFT后门拿服务器之方法总结
提权工具如下:cmd.exe Churrasco.exe nc.exe 提权前提:Wscript组件成功开启 如果Wscript组件被关闭,则使用以下方法开启: 源代码: <object run ...
- Python之路【第十五篇】WEB框架
WEB框架本质 Python的WEB框架分为两类: 1.自己写socket,自己处理请求 2.基于wsgi(Web Server Gateway Interface WEB服务网关接口),自己处理请求 ...
- yii2 widget示例
<?php namespace app\components; use yii\base\Widget; use yii\helpers\Html; class RctReplyWidget e ...