【问题标题】:Has_many :through in Rails 3 - with an extra ID to be set in the joining modelHas_many :through in Rails 3 - 在加入模型中设置一个额外的 ID
【发布时间】:2012-04-11 14:11:59
【问题描述】:

我整理了一张图表来帮助解释这个问题:http://i.imgur.com/ZnN1X.png

基本上,在我的“新员工”表单上,我目前有一个员工姓名输入字段和一个列出所有公司的选择框。如果我选择一家公司并点击Go,它会在“就业”中创建一个新记录。到目前为止,一切顺利。

我的问题是,在选择公司时,还需要在“就业”模型中设置类型,该模型链接到“就业类型”模型。理想情况下,我可以拥有 2 种不同类型的工作 - 但都列出了相同的公司。

提前致谢,任何帮助将不胜感激!

【问题讨论】:

    标签: ruby-on-rails ruby-on-rails-3 model sqlite


    【解决方案1】:

    不确定我是否完全理解您的问题,但我会试一试。

    员工模型:

    has_many :employments, :dependent => :destroy
    has_many :companies; :through=>employments
    has_many :employment_types, :through=>employments
    

    公司模式:

    has_many :employments
    has_many :employees; :through=>employments
    has_many :employment_types, :through=>employments
    

    就业类型模型:

    has_many :employments
    has_many :companies; :through=>employments
    has_many :employees; :through=>employments
    

    就业模式:

    belongs_to :employee
    belongs_to :company
    belongs_to :employment_type
    

    查看代码:

    <%= form_for @employee do |f| %>
      <%= f.text_field :name %>
      <% 2.times do %>
        <%= f.fields_for :employments, @employee.employments.build do |employment_fields| %>
          <%= f.select :company_id, options_from_collection_for_select(Company.all, 'id', 'name') %>
          <%= f.select :employment_type_id, options_from_collection_for_select(EmploymentType.all, 'id', 'name') %>
        <% end %>
      <% end %>
    <% end %>
    

    在您的图表中,您将 ID 字段设置为非标准 (model_id),rails 通常更喜欢这些字段只是 id。但是您可以通过将其添加到每个模型来覆盖默认主键:

    set_primary_key <symbol representing primary key>
    

    【讨论】:

    • 您能否将代码发布到您的 create 方法以及请求中的 params 哈希副本?
    • 什么默认创建方法?您是否使用脚手架或其他东西来创建您的控制器?
    • 您的观点似乎有些奇怪。你能张贴你的表格。我们应该能够从employee"=>{"name"=>"David Smith", "company_ids"=>["", "3"], "company_type_ids"=>["", "1" 更改参数]} to employee"=>{"name"=>"David Smith", "employments"=> [{"company_ids"=>"", "company_type_ids"=>""}, ...]}
    • 我更新了答案,让你们两个必须以一种形式工作。您可能需要针对您的确切代码进行调整,但这将适用于我之前定义的模型。
    • 应该是employments.build
    猜你喜欢
    • 1970-01-01
    • 2011-03-06
    • 2011-06-11
    • 2012-02-22
    • 1970-01-01
    • 1970-01-01
    • 2011-10-21
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多