将Object转换为hash,然后将其保存到用户列

时间:2015-10-13 08:26:35

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

找不到任何接近我试图做的事情。我想将一个对象存储到用户的列中。该列采用数组的形式:

#postgres
def change
  add_column :users, :interest, :string, array: true, default: '{}'
end

我有另一个名为FooBar的模型用于其他用途。每个用户都有独特的信息,因为我添加了user_id密钥。

我试图更有意义:

def interest
 @user = User.find(current_user.id ) # I need the logged in user's id
 @support = Support.find(params[:id]) # I need the post's id they are on
 u = FooBar.new
 u.user_id = @user
 u.support_id = @support
 u.save # This saves a new Foo object..this is what I want

 @user.interest.push(FooBar.find(@user)) # This just stores the object name itself ;)
end

所以当我调用u1 = FooBar.find(1)时,我得到哈希值的返回值。我想说u1.interest我得到同样的结果。原因是,我需要在用户上定位这些键,即:u1.interest[0].support_id

这可能吗?我查看了我的基本ruby文档,没有任何作用。哦..如果我通过FooBar.find(@user).inspect,我会得到哈希,但不是我想要的方式。

我尝试做类似于stripe的事情。查看他们的data密钥。这是一个哈希。

编辑Rich'回答:

字面上,我有一个名为UserInterestSent模型和表格的模型:

class UserInterestSent < ActiveRecord::Base
  belongs_to :user
  belongs_to :support # you can call this post
end

class CreateUserInterestSents < ActiveRecord::Migration
  def change
    create_table :user_interest_sents do |t|
      t.integer :user_id # user's unique id to associate with post (support)
      t.integer :interest_sent, :default => 0 # this will manually set to 1
      t.integer :support_id, :default => 0 # id of the post they're on

      t.timestamps # I need the time it was sent/requested for each user
    end
  end
end 

我致电interest interest_already_sent

supports_controller.rb:

  def interest_already_sent
    support = Support.find(params[:id])
    u = UserInterestSent.new(
      {
        'interest_sent' => 1, # they can only send one per support (post)
        'user_id' => current_user.id, # here I add the current user
        'support_id' => support.id, # and the post id they're on
      }) 
        current_user.interest << u # somewhere this inserts twice with different timestamps
  end 

interest兴趣,列:

class AddInterestToUsers < ActiveRecord::Migration
  def change
    add_column :users, :interest, :text
  end
end

4 个答案:

答案 0 :(得分:1)

修改

要将Hash存储到列中,我建议您使用“text”而不是

def change
  add_column :users, :interest, :text
end

然后将“serialize”设置为属性

class User < ActiveRecord::Base
  serialize :interest
end

一旦完成,您可以正确保存哈希对象

def interest
  @user = User.find(current_user.id ) # I need the logged in user's id
  @support = Support.find(params[:id]) # I need the post's id they are on
  u = FooBar.new
  u.user_id = @user
  u.support_id = @support
  u.save # This saves a new Foo object..this is what I want

  @user.interest = u.attributes # store hash
  @user.save 
end

答案 1 :(得分:1)

HStore

我记得有一个名为 hStore 的PGSQL数据类型:

  

该模块实现用于存储集合的hstore数据类型   单个PostgreSQL值内的键/值对。这可能很有用   在各种情况下,例如具有许多属性的行   很少检查或半结构化数据。键和值很简单   文字字符串。

Heroku supports it我已经看到它用于我正在观察的另一个实时应用程序。

它不会以与Stripe的{​​{1}}属性相同的方式存储您的对象(为此,您只需要使用data并保存对象本身) ,但你可以存储一系列text对(JSON)。

我之前从未使用过它,但我想你可以向列发送一个JSON对象,它可以让你使用你需要的属性。有good tutorial hereRails documentation here

key:value

-

这意味着您应该只能将JSON对象传递到# app/models/profile.rb class Profile < ActiveRecord::Base end Profile.create(settings: { "color" => "blue", "resolution" => "800x600" }) profile = Profile.first profile.settings # => {"color"=>"blue", "resolution"=>"800x600"} profile.settings = {"color" => "yellow", "resolution" => "1280x1024"} profile.save! 列:

hstore

根据您的评论,在我看来,您正试图将“兴趣”存储在另一个模型的#app/controllers/profiles_controller.rb class ProfilesController < ApplicationController def update @profile = current_user.profile @profile.update profile_params end private def profile_params params.require(:profile).permit(:x, :y, :z) #-> z = {"color": "blue", "weight": "heavy"} end end 中。

我的第一个解释是您希望在User列中存储哈希信息。也许你有@user.interests或其他什么。

从您的评论中,您似乎想要在此列中存储关联的对象/数据。如果是这种情况,您的方式应该是使用ActiveRecord association

如果你不知道这是什么,它本质上是一种通过数据库中的外键将两个或多个模型连接在一起的方法。你设置它的方式将决定你可以存储什么&amp;如何...

{name: "interest", type: "sport"}

通过使用此功能,您可以分别填充#app/models/user.rb class User < ActiveRecord::Base has_and_belongs_to_many :interests, class_name: "Support", join_table: :users_supports, foreign_key: :user_id, association_foreign_key: :support_id end #app/models/support.rb class Support < ActiveRecord::Base has_and_belongs_to_many :users, class_name: "Support", join_table: :users_supports, foreign_key: :support_id, association_foreign_key: :user_id end #join table = users_supports (user_id, support_id) .interests方法:

.users

这样您就可以调用#config/routes.rb resources :supports do post :interest #-> url.com/supports/:support_id/interest end #app/controllers/supports_controller.rb class SupportsController < ApplicationController def interest @support = Support.find params[:support_id] # I need the post's id they are on current_user.interests << @support end end 并带回一组@user.interests个对象。

好的,看。

我建议使用Support列的替代

您似乎想要为关联模型存储一系列哈希值。这正是interest关系的用途。

您的数据被填充两次的原因是因为您要调用它两次(many-to-many直接在连接模型上创建记录,然后您使用u=插入更多数据)

我必须在两个实例中添加正确的行为;正在填充连接模型,允许您调用关联的对象。

你想要的是这样的:

enter image description here

<<

使用我推荐的方法时,摆脱def interest_already_sent support = Support.find params[:id] current_user.interests << support end

您可以通过加入表致电interest

使用上面的代码时,它告诉Rails将.interests对象(IE support插入support_id(IE current_useruser_id关联(填充了interests表格。

这基本上会使用UserInterestSelf user_idcurrent_user support_id向此表添加新记录。

答案 2 :(得分:-1)

将AR对象转换为哈希使用object.attributes

要在模型字段中存储自定义哈希,您可以使用serializeActiveRecord::Store

答案 3 :(得分:-1)

您也可以将to_json方法用作 object.to_json

User.find(current_user.id ).to_json   # gives a json string