【问题标题】:Rails Best practices : associated object creation in modelRails 最佳实践:在模型中创建关联对象
【发布时间】:2012-03-09 18:06:18
【问题描述】:

我基本上有 3 个表:用户(电子邮件、密码)、联系人(姓名、电话)、关系(用户 ID、联系人 ID、级别)。

当用户创建新联系人时,我希望他与该联系人相关联。该关联有 1 到 3 作为“友谊”级别。

我使用表单在我的联系人#create 控制器中输入级别。

现在,我有这个很好用的

  def create
    @contact = Contact.new(params[:contact])
    if @contact.save
      #@relation = Relation.new(:user_id => current_user.id, :contact_id => @contact.id, :level => params[:relation])
      #@relation.save
      redirect_to root_url, :notice => "ok!"
    else
      render "new"
    end
  end

我正在考虑将关系创建转移到我的联系人模型中以执行以下操作:

  after_create { Relation.create(user_id: current_user.id, contact_id: self.id, level: params[:relation]) }

当然,这不起作用,但你明白了。 在模型中这样做会好还是我现在可以保留它

干杯

【问题讨论】:

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


    【解决方案1】:

    这样的?基本上只需将关系和联系人合二为一,与 current_user 关联。

    current_user.relations.create(contact: Contact.new(params[:contact]), level: params[:relation])

    不要将其移至 after_create。如果有什么东西可以在某个地方创建一个函数来接受用户、联系人和关系。

    【讨论】:

      【解决方案2】:

      我宁愿将它保存在控制器中,就像你拥有它一样。出于测试(以及可能的其他)目的,您可能不希望将用户和联系人如此紧密地联系在一起。我看到的方式是控制器是将创建逻辑捆绑在一起的地方,而模型中after_create之类的方法更多是设置某些参数,而不是创建新的关联,将来您可能不一定想要.

      tl;dr - 将这样的东西放在控制器中会使两个模型紧密耦合在一起。

      【讨论】:

        【解决方案3】:

        contact.rb

        has_one :relation
        accepts_nested_attributes_for :relation
        

        关系

        belongs_to :contact
        belongs_to :user
        

        喜欢的浏览量

        = for_form @contact do |f|
          = f.fields_for :relation do |r|
            = r.text_field :level
          = f.submit 'create'
        

        控制器新动作

          @contact = Contact.new
          @contact.build_relation # create new relation object for the contact
        

        控制器创建动作

          @contact = Contact.new(params[:contact])
          @contact.relation.user = current_user
          @contact.save
        

        【讨论】:

        • @contact.build_relation 的作用是什么?
        • @bobylapointe 它将创建一个新关系并将其分配给@contact
        • @bobylapointe @contact.build_relation 将为联系人创建关系对象。有必要在联系表单中呈现关系视图
        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2011-12-07
        • 1970-01-01
        • 2011-10-29
        • 1970-01-01
        相关资源
        最近更新 更多