这次做新项目的时候,把图片都放在了一个表里,其他表中不再存图片信息,通过多态关联建立表之间的关系。

(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/

accepts_nested_attributes_for(*attr_names)Link

Defines an attributes writer for the specified association(s).

Supported options:

:allow_destroy

If true, destroys any members from the attributes hash with a _destroy key and a value that evaluates to true(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 true orfalse. When no :reject_if is specified,

a record will be built for all attribute hashes that do not have a _destroyvalue that evaluates to true.

Passing :all_blank instead 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 :limit option 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 is false and the nested attributes are used to update the existing record only if they include the record's:id value.

Otherwise a new record will be instantiated and used to replace the existing one.

However if the:update_only option is true, the nested attributes are used to update the record's attributes always,

regardless of whether the :id is 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.html
如果在编辑或者新建component的时候,传的picture相关的参数里带有id,那么这条图片记录会被修改,不会被新建。

If 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的更多相关文章

  1. Windows下: RubyMine + Ruby On Rails + mysql 搭建开发环境

    最近在接手一个手机项目.在搭建环境的过程中,遇到了一些问题,在下文中已做记录,并奉上个人的解决方案. 开发环境 win2003 ;  JetBrains RubyMine6.3.3 1.  下载最新版 ...

  2. [ruby on rails] 跟我学之(8)修改数据

    修改views 修改index视图(app/views/posts/index.html.erb),添加编辑链接,如下: <h1>Our blogs</h1> <% @p ...

  3. [ruby on rails] 跟我学之(3)基于rails console的查增删改操作

    本章节展开对model的介绍:包括查增删改操作.紧接着上面一节<[ruby on rails] 跟我学之HelloWorld> 创建模型 使用命令创建模型 创建表post,默认自带两栏位 ...

  4. [Ruby on Rails系列]6、一个简单的暗语生成器与解释器(上)

    [0]Ruby on Rails 系列回顾 [Ruby on Rails系列]1.开发环境准备:Vmware和Linux的安装 [Ruby on Rails系列]2.开发环境准备:Ruby on Ra ...

  5. laravel的多态关联--morphTo和morphMany

    首先,文档里面讲述的不是特别详细,详细寻找查询流程没有过多介绍,只是介绍如何去定义,直接使用,导致很多该明白的东西,没有说明,下面详细看看这个多态关联 是怎么定义,使用,详细查询的. 先看文档介绍 多 ...

  6. Ruby on Rails 實戰聖經阅读(三)

    由于是1.8.x:圣经的1.9.3差太多,所以另外按1.8.X来创建hello world 第一個Hello World!! 1. 创建项目rails -d mysql first 2.创建控制器  ...

  7. [技术博客] 软工-Ruby on Rails 后端开发总结分享

    [技术博客] 软工-Ruby on Rails 后端开发总结分享 在这次软件编写中,我们的后端使用了Ruby on Rails (RoR)框架. Rails框架是用Ruby编写的.这意味着当我们为Ru ...

  8. Linux超快速安装Ruby on Rails

    Linux超快速安装Ruby on Rails 时间 2014-11-25 11:45:11 Flincllck Talk 原文  http://www.flincllck.com/quick-ins ...

  9. 管理不同版本ruby和rails的利器——rvm

    近年来,ruby on rails逐渐火了起来,我想各位码农早就耳闻,特别是那些做B/S项目的童鞋,早就想跃跃一试了. 笔者也是初次接触ruby on rails ,我想,对于初学者来说,最好的学习方 ...

随机推荐

  1. nginx主备配置

    添加配置: proxy_next_upstream error timeout invalid_header http_500 http_503 http_502; upstream http.wea ...

  2. TextBox的值是否为数字

    <asp:TextBox ID="t" Width="70" runat="server" style="ime-mode: ...

  3. 自然语言18.2_NLTK命名实体识别

    QQ:231469242 欢迎nltk爱好者交流 http://blog.csdn.net/u010718606/article/details/50148261 NLTK中对于很多自然语言处理应用有 ...

  4. Git版本控制软件结合GitHub从入门到精通常用命令学习手册(转)

    简要参考:http://www.tuicool.com/articles/mEvaq2 http://gitref.org/zh/index.html GIT 学习手册简介 本站为 Git 学习参考手 ...

  5. Java数据结构的特点

  6. 《CSS3实战》读书笔记 第2章 层叠样式表(CSS)

    ## 层叠样式表 本章将阐述CSS的基本规则. ### 解构CSS 所谓CSS,由选择器(selector)和声明块(declaration block)组成.再进一步细分,每个声明包括了属性和值. ...

  7. CodeLite的姿势

    在Mac上安装cscope 1.下载cscope的Zip压缩包 2.解压 3.打开终端,进入解压目录,运行 ./configure make make install 4.在CodeLite中,在Pl ...

  8. 程序日志输出实现-Log4j

    学习开发的过程中,我们都应该用过System.out.println():来做一些调试工作,有时候确实很有用有没有.但是这种简单粗暴的方式让程序中到处存在着sysout.这种方式难免会有性能的影响,维 ...

  9. MySQL5.7 Replication主从复制配置教程

    最近配置mysql5.7主从复制的时候碰到了些问题,老老实实按老版本的步骤配置会有错误,后来自己查看了官方文档,才解决了问题,在这里总结一下5.7的配置步骤, 大体步骤跟老版本的还是一样的,只是有一些 ...

  10. android-解决EditText的inputType为Password时, 字体不一致的问题

    今天做项目的时候,发现当edittext 的InputType为password时,它的字体和原来不一样: 网上找了一下,给出了解决办法: 第一: 去掉xml文件中的password配置,在代码中编写 ...