【问题标题】:rails model associations recorded in controller控制器中记录的导轨模型关联
【发布时间】:2015-03-14 12:48:23
【问题描述】:

我有一个包含 3 个模型的应用程序 user companypost

我无法弄清楚逻辑

一个用户可以有很多公司,一个公司可以有很多帖子。

这是我的模型

class user < ActiveRecord::Base
  has_many :companies
end

class company < ActiveRecord::Base
  belongs_to :user
  has_many :posts
end

class post < ActiveRecord::Base
  belongs_to :company
end

注意:company 有 user_id,post 有 company_id 在 table

如何确保在创建帖子时自动记录 company_id

额外信息:对于路线,它将是 resources :jobsresources :companies

--更新--

后控制器

def new
 Post.new(post_params)
end
def create
 Post.new(post_params)
 if @post.save
  redirect_to @post
 else
  render 'new'
 end
end

路线

resources :companies
resources :posts

【问题讨论】:

  • 您能否在您的posts_controller 中发布您的create 方法以及您的帖子和公司的routes.rb。
  • 已更新信息
  • 您如何选择将帖子附加到哪个公司?表格中有公司选择器吗?

标签: ruby-on-rails ruby-on-rails-4 model-view-controller


【解决方案1】:

我想我可能会将posts 嵌套在companies 中,因此您可以在参数中使用company_id

注意如果你这样做,你的路径名将会改变。

Routes.rb

resources :companies do
  resources :posts
end

posts_controller.rb

def create
  @company = Company.find(params[:company_id])
  @post = @company.posts.build(post_params)
  ...
end

而且由于您希望在控制器中的每个操作中找到公司,您可以对其进行一些重构。

class PostsController
  before_action :set_company

  def index
    @post = @company.posts
  end

  def create
    @post = @company.posts.build(post_params)
    ...
  end

  ...
  ...

  private

  def set_company
    @company = Company.find(params[:company_id])
  end
end

【讨论】:

  • 这是一个好方法,正如我在回答中提到的那样,但是对每个操作都提出额外的请求可能有点过头了,特别是如果 @company 包含大量信息,而这不是这些帖子真的很有必要。
  • 我不反对,但我认为如果 OP 要在companies 下添加更多内容,它会更简洁,并为前进奠定基础。
  • 我认为这两种解决方案都很棒,@company 会让事情变得更容易
  • 我不是在质疑嵌套资源方法,我只是在质疑 before_action 上 set_company 的必要性,而不是仅仅在 create 的一行中设置 company_id。它不需要去其他任何地方)
【解决方案2】:

想到2个选项。

  1. 您可以在posts#new 视图中创建一个隐藏的company_id 字段,以便它与您的参数一起自动发送,因此在模型中进行相应设置(前提是您允许)。但在这种情况下,您需要在创建@post 时在控制器中填充该字段。就像这样:

    @post = Post.new(company_id: some_company_id)
    
  2. 使用嵌套资源。首先将您的路线更改为:

    resources :companies do 
      resoures :posts
    end
    

    这样,当您查看 rake routes 输出时,您会看到在请求 url 中设置了 :company_id 参数。因此,当您继续创建帖子时,您可以使用 @post.company_id = params[:company_id] 并完成。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-09-23
    相关资源
    最近更新 更多