Rails 最佳实践:在模型中创建关联对象

问题描述 投票:0回答:3

我基本上有 3 个表:用户(电子邮件、密码)、联系人(姓名、电话)、关系(user_id、contact_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
3个回答
2
投票

有这样的事吗?基本上只需创建与 current_user 关联的关系和联系人。

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

不要将其移至 after_create。如果有的话,请在某处创建一个接受用户、联系人和关系的函数。


1
投票

我宁愿将其保留在您拥有的控制器中。出于测试(以及可能的其他)目的,您可能不希望用户和联系人如此紧密地联系在一起。我的看法是,控制器是将创建逻辑结合在一起的地方,模型中像

after_create
这样的方法更多的是设置某些参数,而不是创建新的关联,将来你可能不一定想要这样。

tl;dr - 将这样的东西放入控制器中会将两个模型耦合得太紧密。


1
投票

联系.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
© www.soinside.com 2019 - 2024. All rights reserved.