rails模型关联记录在控制器中

时间:2015-03-14 12:48:24

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

我的申请包含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

注意:公司有user_id,post表中有company_id

如何确保在创建帖子时自动记录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

2 个答案:

答案 0 :(得分: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

答案 1 :(得分:0)

我想到了两个选项。

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

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

    resources :companies do 
      resoures :posts
    end
    

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