格式化simple_form集合选择

时间:2015-11-26 14:38:11

标签: ruby-on-rails

我想使用grouped_collection_select,但我的数据行为不同。

我有例如Post来自comments。我可以执行Post.find(:id).comments但不能Comment.find(:id).postsComment属于authorauthor属于post

我想在评论作者:

中添加一个由我的表单添加的选项
= grouped_collection_select(:post, :id, @posts, :comments, :title, :id, :author)

我知道它错了,但我怎么能倒掉呢?目前它给我的回报是

<select name="posts[:id]">
  <optgroup label="Post 1 title">
    <option value="4536">Soica</option>
    <option value="56775">Bob</option>
  </optgroup>
  <optgroup label="Post 2 title">
    <option value="7897" selected="selected">Sandy</option>
    <option value="266">Sarah</option>
  </optgroup>
</select>

是否有可能欺骗它并通过评论作者过滤它?也许grouped_collection_select不是最佳解决方案?

1 个答案:

答案 0 :(得分:3)

你可以通过将关系声明为:

来简化你的关系和应用
class Post < ActiveRecord::Base
  belongs_to :author
  has_many :comments
end

class Author < ActiveRecord::Base
  has_many :posts
  has_many :comments
end

class Comment < ActiveRecord::Base
  belongs_to :author
  belongs_to :post
end

Database sketch

请注意,在belongs_to关系中,您需要使用单数形式。所以从评论到帖子你总是会使用:

Comment.find(6).post

不是.posts。你不太可能想要一个多对多的模型,评论可能属于许多帖子。

根据评论在authors上撰写查询有点棘手,但是极其可行。

@authors = Author.includes(:comments)
                 .where(comments: { post_id: 7 })
                 .order(:name) # or however you want to sort it.

你会像这样创建输入:

grouped_collection_select(
  :post, 
  :id, 
  @authors, 
  :comments, 
  :name, 
  :id, 
  :name
)