创建没有模型的对象,而创建需要在其他表中创建多个条目

时间:2013-11-06 00:03:20

标签: ruby-on-rails ruby

在应用程序中,用户可以输入新的帖子,其中包含帖子的标题内容和帖子的类别 。所以创建新帖子将通过一些简单的html表单,几个字段。现在我不知道在哪里放置创建新帖子的逻辑,原因如下:

帖子(或帖子集合)是从不同的表格构建的对象,例如。

@posts = User.joins(entries: [{storage: :vote}, :category]) 
             .where("votes.count > ?", 0)
             .select("users.username AS username,
                      storages.id AS storage_id,
                      storages.title AS title, 
                      storages.content AS content, 
                      votes.count AS votes, 
                      categories.category_name AS category_name")
             .order("votes.count DESC")

因此,当用户创建新帖子时,必须在不同的表格中创建新条目:

1.在条目表中创建新条目。 (id, user_id, category_id)
2.在存储表中创建新条目。(id, title, content, entry_id)
3.在投票表格中创建新条目。(id, count, storage_id)

帖子是模型的情况下,我可以使用类似resources: posts的内容,然后在帖子控制器中通过newcreate我可以创建新帖子,但在这样的情况下,我不需要帖子控制器或发布模型?那么,问题是:哪个地方更适合用于创建新帖子的逻辑?的 Q1

我的解决方案是使用resource: storages, :only => [:new, :create]创建存储控制器然后通过new和create这个控制器来填充db中的不同表?我在这里强迫only,因为我在这里看不到任何其他CRUD动作(比如显示全部或一个存储),因为我不会单独使用存储,而是与其他表一起使用。所以从视图/存储到new.html.erb和create.html.erb我可以构建新的帖子?的 Q2

另一个解决方案是创建Post控制器,它没有我之前所述的“对应”后置模型。在这里,我猜我不能使用宁静的路线(CRUD),因为帖子没有:id?我只能手动制作非宁静的路线,如:
post 'posts/create/:title/:content/:category' => 'posts#create', :as => 'create_post'然后从params[:title]params[:content]params[:category]填充其他表格。的 Q3

我是铁杆新手所以请不要大叫:D

2 个答案:

答案 0 :(得分:1)

这听起来就像是对嵌套表单的调用,它被屏幕投射覆盖 here

您使用顶级模型的资源,在本例中为Entry。 并向下钻取到第3个模型。

下一步的简单示例。 模型应该如此,

entry.rb

class Entry < ActiveRecord::Base
  has_many :storages, :dependent => :destroy
  accepts_nested_attributes_for :storages, :allow_destroy => true
end

storage.rb

class Storage < ActiveRecord::Base

  belongs_to :entry
  has_many :votes, :dependent => :destroy
  accepts_nested_attributes_for :votes, :allow_destroy => true
end

vote.rb

class Vote < ActiveRecord::Base
  belongs_to :storage
end

表单应该是这样的,用simple_form风格

<%= simple_form_for @entry do |f| %>

  <%= f.simple_fields_for :storages do |storage_fields| %>
    <%= storage_fields_for :votes do |vote_fields| %>

    <% end %> 
  <% end %>
<% end %>

如果您已设置所有模型,则不必对控制器执行任何操作。

这种方法也很不错,因为如果需要,你可以添加多个存储空间并投票ajax样式(无需重新加载页面),这总是很好。

答案 1 :(得分:0)

我会在任何时候使用表单类而不是嵌套属性,请参阅http://blog.codeclimate.com/blog/2012/10/17/7-ways-to-decompose-fat-activerecord-models/以获取此模式的示例(“3.提取表单对象”一章)

我经常使用这种模式来对它进行创作https://github.com/bbozo/simple_form_class并且它大致以这种方式使用:https://gist.github.com/bbozo/5036937,如果你有兴趣使用它,我会推送一些文档

编辑:为什么我倾向于大多数时间都去表单类路由是因为嵌套属性最终从来没有让我感到困惑,要么因为强参数处理变得麻烦,要么验证器变得太复杂(如果持久化? ...),或持久性逻辑需要扩展,以支持一些小诀窍,解决回调地狱或模型中的递归保存(保存意大利面条问题之前/之后)