铁轨烤模型

时间:2016-01-24 04:30:04

标签: ruby-on-rails ruby ruby-on-rails-3 ruby-on-rails-4

我有像这样的模特协会

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构建用户发布的应用程序。 项目模型有订单栏,因此用户可以选择并添加任何电影,链接,照片以构建自己的帖子。

我如何为这些模型制作表格?

1 个答案:

答案 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