两个模型之间的关联

时间:2015-09-29 19:02:29

标签: ruby-on-rails ruby-on-rails-4 model associations

感谢您的光临。我仍然是连接模型的新手并且有一个问题。我目前有两种型号:

create_table "users", force: true do |t|
 t.string   "first_name"
 t.string   "last_name"
 t.string   "email"
 t.string   "password_digest"
 t.string   "user_name"
 t.date     "birthdate"
 t.integer  "zip_code"
 t.string   "gender"
 t.datetime "created_at"
 t.datetime "updated_at"
 t.string   "avatar_file_name"
 t.string   "avatar_content_type"
 t.integer  "avatar_file_size"
 t.datetime "avatar_updated_at"
 t.string   "background_file_name"
 t.string   "background_content_type"
 t.integer  "background_file_size"
 t.datetime "background_updated_at"
 t.string   "slug"
end

create_table "user_avatars", force: true do |t|
 t.integer  "user_id"
 t.datetime "created_at"
 t.datetime "updated_at"
 t.string   "avatar_file_name"
 t.string   "avatar_content_type"
 t.integer  "avatar_file_size"
 t.datetime "avatar_updated_at"
end

正如你所看到的那样,用户模型变得非常漫长并且有人告诉我,如果我将头像分成单独的模型会更好。我的问题是,如果没有两个单独的Form_for字段,我将如何更改用户个人资料信息?因为我希望用户能够同时编辑user_name,first_name等以及UserAvatar.avatar。感谢所有帮助以及帮助我​​学习新知识的人。

有关详细信息,请询问

用户模型

has_one :user_avatar

has_attached_file :avatar, :styles => {
 :medium => "200x200>",
 :small => "120x120#",
 :thumb => "75x75#",
 :default_url => "http://www.adtechnology.co.uk/images/UGM-default-user.png"
   }

validates_attachment_content_type :avatar, :content_type => /\Aimage\/.*\Z/

UserAvatar模型

belongs_to :user

has_attached_file :avatar, :styles => {
 :medium => "200x200>",
 :small => "120x120#",
 :thumb => "75x75#",
 :default_url => "http://www.adtechnology.co.uk/images/UGM-default-user.png"
   }

validates_attachment_content_type :avatar, :content_type => /\Aimage\/.*\Z/

观看=用户/指数

<%= form_for @user, url: user_path(current_user), html: { method: :put, :multipart => true } do |f| %>
 <p class="editpage">Profile Picture: <%= f.file_field :avatar %></p>
 <%= f.submit "Upload" %>
<% end %> 

3 个答案:

答案 0 :(得分:1)

您可以这样使用:

型号:

class User < ActiveRecord::Base
  has_one :user_avatar
  accepts_nested_attributes_for :user_avatar, allow_destroy: true
end

class UserAvatar < ActiveRecord::Base
  belongs_to :user

  has_attached_file :avatar, :styles => {
    :medium => "200x200>",
    :small => "120x120#",
    :thumb => "75x75#",
    :default_url => "http://www.adtechnology.co.uk/images/UGM-default-user.png"
  }

  validates_attachment_content_type :avatar, :content_type => /\Aimage\/.*\Z/
end

查看:

<%= form_for @user, url: user_path(current_user), html: { method: :put, :multipart => true } do |f| %>
  <%= fields_for @user.user_avatar do |user_avatar_form| %>
    <p class="editpage">Profile Picture: <%= user_avatar_form.file_field :avatar %></p>
  <% end %>
  <%= f.submit "Upload" %>
<% end %> 

您还可以查看http://apidock.com/rails/ActionView/Helpers/FormHelper/fields_forhttp://guides.rubyonrails.org/form_helpers.html以获取更多信息。

答案 1 :(得分:0)

我认为你刚刚得知你得到了一些不好的建议。

将它们分开的基础是什么?它使您的代码更加复杂,因此容易出错。

我认为您可以采取的最佳步骤是恢复单一模式。

答案 2 :(得分:0)

最好还原到单个模型,或者如果您使用单独的模型进行头像,则使用fields_for concept watch it