我有像这样的模特协会
post.rb
title:字符串说明:文字
var mongoose = require('mongoose');
var Schema = mongoose.Schema;
var personSchema = new Schema({
name: String,
});
module.exports = mongoose.model('Person', personSchema);
item.rb的
post_id:整数顺序:整数
class Post < ActiveRecord::Base
belongs_to :user
has_many :items
accepts_nested_attributes_for :items
end
链接,电影,照片,quate.rb
link.rb:item_id:integer url:string url-text:string
movie.rb:item_id:integer youtube-url:string
photo.rb:item_id:integer image:string comment:string title:string
quate.rb:item_id:integer quate:string q-url:string q-title:string
class Item < ActiveRecord::Base
belongs_to :post
has_one :link
has_one :movie
has_one :photo
has_one :quate
end
我想通过ruby on rails构建用户发布的应用程序。 项目模型有订单栏,因此用户可以选择并添加任何电影,链接,照片以构建自己的帖子。
我如何为这些模型制作表格?
答案 0 :(得分:0)
这可能不是您需要的定义;如果需要,我会删除。
您的belongs_to
模型有antipattern。它们看起来像是单个数据集,我会将它们合并到Item
模型中,使用enum
来区分它们的状态:
#app/models/item.rb
class Item < ActiveRecord::Base
#schema id | post_id | state | url | title | comment | created_at | updated_at
belongs_to :post
enum state: [:link, :movie, :photo, :quate]
end
这将使您能够创建Item
的实例,然后您可以分配不同的“状态”:
@item = Item.new
@item.state = :link
虽然这意味着更改您的模式,但它可以让您直接为items
存储post
(而不必将其与其他模型相关联):
#app/controllers/posts_controller.rb
class PostsController < ApplicationController
def new
@post = Post.new
@post.items.build
end
def create
@post = Post.new post_params
@post.save
end
private
def post_params
params.require(:post).permit(items_attributes: [:state, :url, :title, :comment])
end
end
#app/views/posts/new.html.erb
<%= form_for @post do |f| %>
<%= f.fields_for :items do |i| %>
<%= i.select :state, Item.states.keys.map {|role| [role.titleize,role]}) %>
<%= i.text_field :url %>
<%= i.text_field :title %>
<%= i.text_field :comment %>
<% end %>
<%= f.submit %>
<% end %>
您还需要确保Post
模型中有accepts_nested_attributes_for
:
#app/models/post.rb
class Post < ActiveRecord::Base
has_many :items
accepts_nested_attributes_for :items
end