将设计用户与帖子相关联

时间:2016-01-09 14:14:32

标签: ruby-on-rails ruby mongodb devise

我正在使用设计,现在我正在尝试将用户与文章相关联。

我在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

我对如何正确地做到这一点了解不足。

2 个答案:

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

并详细说明这是如何工作的(关于你提到的问题)我将解释每种方法的工作原理......

方法1

在这种方法中,您正在创建一个对象并手动设置其所有属性...这意味着您将使用他们期望序列化对象的正确值覆盖:user:user_id正确地对DB(无论是mongoDB还是Postgres或其他)

方法2

在这种方法中,您将抓取用户模型本身并使用关系帮助器方法创建文章...这将自动计算文章的user_id属性并使用其余关系正确设置...(因为用户有很多文章......任何user.articles.create!都会抓住关系user_id

方法3

在这种方法中,您使用@article = Article.new(article_params)创建了一个ruby对象(而不是数据库记录),其中包含所需属性的子集...并且您不会持久保存该DB(但)... 然后你自己手动设置article <-> user关系...... 最后,您使用.save.save!

将该记录保存到数据库

答案 1 :(得分:1)

在你的articles_controller中,与链接的答案相同:

@article.user = current_user