【问题标题】:Form in Ruby on Rails: using find and create by in the modelRuby on Rails 中的表单:在模型中使用 find 和 create by
【发布时间】:2017-09-18 15:43:59
【问题描述】:

“find_or_create_by”是解决我问题的关键吗?

回答不!下面是另一个可行的建议。

我接管了一个系统。它管理课程及其参与者。按照课程的形式,用户可以输入自己的个人数据,如姓名、工作地点(机构)等。

相关表:

  • 课程
  • 参与者
  • 机构

当用户点击进入这个表单时

  1. 应创建一个新参与者(id、person_id、course_id)
  2. 应该创建一个新人(id、institution_id、prename、surname 等)
  3. 应该创建一个新机构(ID、描述等)

以下确实有效

当用户点击回车时:

  1. 创建了一个新机构(ID、描述等)
  2. 使用正确的机构 ID(id、institution_id 等)创建了一个新人

以下不起作用:

  1. 未创建新的对应参与者(id、person_id、course_id)

我对 Rails 很陌生。但我猜在人模型中(下)def institution_description 导致在机构表和人员表(?)中创建记录。但我真的不确定。

Person 模型代码

class Person < ActiveRecord::Base
  belongs_to :institution
  attr_accessible :institution_id,:title,:prename,:surname,:street,:street_number,:zip_code,:city,:phone,:fax,:email,:institution_description
  has_many :participants


def institution_description
    institution.description if institution
end

def institution_description=(description)
    self.institution = Institution.find_or_create_by_description(description) unless description.blank?
end

我的想法是我可以在参与者模型 (?) 中使用类似的定义,例如 course_id。如果给定了 course_id,则创建参与者。但我不确定如何正确使用 course_id(如果这甚至可以这样工作)

参与者模型代码

class Participant < ActiveRecord::Base

  belongs_to :course
  belongs_to :function
  has_one :person


  attr_accessible :course_id, :function_id, :person_id, course_id


def course_id
    participant.course_id if participant
end

def course_id=(course_id)
  self.participant = Participant.find_or_create_by_course_id(course_id) unless trial_id.blank?
end

表单代码

<%= form_for(@person) do |f| %>
<fieldset>
  <div class="table">
    <div class="tr">
      <div class="th">
        <%= f.label t(:institution) %>
      </div>
      <div class="tdsep">:</div>
      <div class="td">
        <%= f.autocomplete_field :institution_description, autocomplete_institution_description_persons_path %>
      </div>
    </div>
    <div class="tr">
      <div class="th">
        <%= f.label t(:title) %>
      </div>
      <div class="tdsep">:</div>
      <div class="td">
        <%= f.text_field :title %>
      </div>
    </div>
    <div class="tr">
      <div class="th">
        <%= f.label :prename, t(:prename_html, :url => Rails.configuration.staffsearch) %>
      </div>
      <div class="tdsep">:</div>
      <div class="td">
        <%= f.text_field :prename %>
      </div>
    </div> #etc...

【问题讨论】:

    标签: ruby-on-rails forms model rails-activerecord


    【解决方案1】:

    PersonCourse之间建立关系

    class Person < ActiveRecord::Base
      belongs_to :organization
      attr_accessible :institution_id,:title,:prename,:surname,:street,:street_number,:zip_code,:city,:phone,:fax,:email,:institution_description
      has_many :participants
      has_many :courses, through: :participants
    

    然后在你的控制器创建方法中你可以做...

    @person.courses << @course
    

    (假设您当前的课程在一个实例变量中,或者如果没有根据需要进行修改)

    这将在您保存User 时自动创建Participant 记录

    【讨论】:

    • 感谢您的回复。我按照建议建立了关系。但我不明白第二部分。你的意思是在Participant 控制器创建方法中我可以写@participant.courses &lt;&lt; @course?因为如果是这样,不幸的是这不起作用。
    • 我应该说@person 而不是@user,现在我已经改变了。您的课程对象是@course 吗?此外,在以后的消息或帖子中,请具体说明错误消息......“不幸的是不起作用”不是很有用。
    • 由于through 关系,Rails 知道如果需要将课程与人员相关联,则创建参与者记录。
    • 好的,我会记住的!我现在添加了Person 控制器@person.courses &lt;&lt; @course,现在我收到一条错误消息undefined method courses' for #&lt;Person:0xa176d1c&gt;。早些时候我没有收到错误消息,因为在两个表中创建了记录。我对rails还不够熟悉。所以我不知道“假设你当前的课程在一个实例变量中”是什么意思。
    • 第一。谢谢!我有一个错字。它现在创建了一个参与者!但奇怪的是,它的id从 10000 开始。下一个是 10001。请注意,此表中已经有参与者。最后一个是 No 3646。你知道这是为什么吗?
    猜你喜欢
    • 2019-05-19
    • 1970-01-01
    • 2011-01-11
    • 1970-01-01
    • 2021-03-02
    • 1970-01-01
    • 1970-01-01
    • 2011-10-05
    • 1970-01-01
    相关资源
    最近更新 更多