我不知道我的标题是好还是床,因为我在轨道上的红宝石中是新的,我在解决一个条件问题,如下例所示。
我有三张表user
,post
& saved_post
用户表
user_id | user_name |
---------------------
1 | ABC |
---------------------
2 | efg |
发表表格
post_id | title |
--------------------
1 | XYZ |
--------------------
2 | xyz |
saved_post表
id | user_id | post_id |
-----------------------------
1 | 1 | 2 |
查看
<% @post.each do |p| %>
<%= p.post_title %>
<%= form_for :create, url: home_path(@save), action: :create, method: :post do |f| %>
<%= f.hidden_field :post_id, :value => p.post_id %>
<button class="btn btn-default btn-save" type="submit">Save</button>
<% end %>
<% end %>
如果user_id 1
在post_id 2
表格中保存saved_post
,则会显示此信息
仅保存user_id 1
,否则显示保存。
我如何才能达到此解决方案?
答案 0 :(得分:1)
您可以尝试使用Active Record的has_many :through
关联。
请参阅此link。
class Users < ActiveRecord::Base
has_many :posts
has_many :saved_posts, through: :posts
end
class Post < ActiveRecord::Base
belongs_to :user
belongs_to :saved_post
end
class SavedPost < ActiveRecord::Base
has_many :posts
has_many :users, through: :posts
end
有关此内容的更多详细信息,请参阅上面的链接。
答案 1 :(得分:0)
Rails是关于约定优于配置的。这意味着如果您按照Rails约定编写Rails应用程序,您将从中获得巨大的好处。
您的表格应以复数形式命名。表和帖子。我从您的评论中理解的是,用户有很多帖子,帖子可以属于很多用户。这是典型的has_and_belongs_to_many关联。
如果将saved_post表重命名为posts_users(两个表名都按字母顺序排列),Rails将知道如何自动处理这些表。
数据库应如下所示:
我使用您的两个用户和方法制作了一个示例应用程序,以便向其中任何一个用户添加帖子。
# routes.rb
root 'posts#index'
resources :posts
# posts_controller.rb
class PostsController < ApplicationController
before_action :set_user
def index
@posts = @current_user.posts
end
def new
@post = @current_user.posts.build(title: 'totally new title')
end
def edit
@post = Post.find(params[:id])
end
def create
@post = Post.new(post_params)
@post.save
redirect_to posts_path
end
def update
@post = Post.find(params[:id])
if @post.update(post_params)
redirect_to posts_path
else
render 'edit'
end
end
# --------------------------------------------------------------------------
private
# --------------------------------------------------------------------------
# Sets the user based on the params value
def set_user
if params[:user_id]
@current_user = User.find(params[:user_id])
else
# If not found, sets the first from the Users table
@current_user = User.first
end
end
def post_params
params.require(:post).permit(:title, {user_ids: []})
end
end
<强>索引强>
# index.html.erb
<h3>Users</h3>
<% User.all.each do |user| %>
<%= link_to user.username, posts_path(user_id: user.id) %> <br />
<% end %>
<h3>Posts for the user: <%= @current_user.username %></h3>
<p>
<% @posts.each do |post| %>
<%= link_to post.title, edit_post_path(post) %> <br />
<% end %>
</p>
<p>
<%= link_to 'Create new post', new_post_path %>
</p>
在修改中,您可以选择将哪些用户附加到此帖子:
# edit.html.erb
<%= render :partial => "post_form", locals: {button_name: 'update'} %>
# _post_form.html.erb
<h3>Post <%= @post.title %> for the user <%= @current_user.username %></h3>
<%= form_for @post do |f| %>
<%= f.text_field :title %> <br />
<p>
<label>
<%= f.collection_check_boxes(:user_ids, User.all, :id, :username) %>
<label><br />
</p>
<p>
<%= f.submit button_name, class: "btn btn-default btn-save" %>
</p>
<% end %>
在post.rb和user.rb文件中,您需要指定这两个类之间的关联。当你正确地命名了posts_users表时,Rails会自动找到它。
# post.rb
class Post < ActiveRecord::Base
has_and_belongs_to_many :users
end
# user.rb
class User < ActiveRecord::Base
has_and_belongs_to_many :posts
end
如果您创建新标题,if将使用相同的表单:
# new.html.erb
<%= render :partial => "post_form", locals: {button_name: 'create'} %>