我正在使用设计,现在我正在尝试将用户与文章相关联。
我在stackoverflow上阅读了一些帖子,但我很难理解它在我的应用程序中是如何工作的。我试图理解this question,但它似乎是黑魔法......
数据库:MongoDB(mongoid gem)
这就是我所拥有的:
article_controller.rb
class Article
include Mongoid::Document
belongs_to :user
field :title, type: String
field :content, type: String
field :user, type: String
default_scope -> { order(created_at: :desc) }
end
article.rb
class User
include Mongoid::Document
has_many :articles
devise :database_authenticatable, :registerable,
:recoverable, :rememberable, :trackable, :validatable
# ... devise configurations
end
user.rb
data.table
我对如何正确地做到这一点了解不足。
答案 0 :(得分:2)
首先在文章模型中,您必须删除此行
field :user, type: String
这是错误的,因为它会与Mongoid生成的方法冲突以获得用户关系。
其次,你必须正确构建文章对象...... 这可以通过以下任何代码来完成
# METHOD 1
@article = Article.create!(
title: article_params[:article][:title],
content: article_params[:article][:content],
user: current_user
# or user_id: current_user.id
)
# METHOD 2
@article = current_user.articles.create!(article_params)
# METHOD 3
# this is mentioned in other answer as well ( but added also here for completeness )
@article = Article.new(article_params)
@article.user = current_user
@article.save!
并详细说明这是如何工作的(关于你提到的问题)我将解释每种方法的工作原理......
在这种方法中,您正在创建一个对象并手动设置其所有属性...这意味着您将使用他们期望序列化对象的正确值覆盖:user
或:user_id
正确地对DB(无论是mongoDB还是Postgres或其他)
在这种方法中,您将抓取用户模型本身并使用关系帮助器方法创建文章...这将自动计算文章的user_id
属性并使用其余关系正确设置...(因为用户有很多文章......任何user.articles.create!
都会抓住关系user_id
在这种方法中,您使用@article = Article.new(article_params)
创建了一个ruby对象(而不是数据库记录),其中包含所需属性的子集...并且您不会持久保存该DB(但)...
然后你自己手动设置article <-> user
关系......
最后,您使用.save
或.save!
答案 1 :(得分:1)
在你的articles_controller中,与链接的答案相同:
@article.user = current_user