找不到任何接近我试图做的事情。我想将一个对象存储到用户的列中。该列采用数组的形式:
#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
答案 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
的PGSQL数据类型:
该模块实现用于存储集合的hstore数据类型 单个
PostgreSQL
值内的键/值对。这可能很有用 在各种情况下,例如具有许多属性的行 很少检查或半结构化数据。键和值很简单 文字字符串。
Heroku supports it我已经看到它用于我正在观察的另一个实时应用程序。
它不会以与Stripe
的{{1}}属性相同的方式存储您的对象(为此,您只需要使用data
并保存对象本身) ,但你可以存储一系列text
对(JSON)。
我之前从未使用过它,但我想你可以向列发送一个JSON对象,它可以让你使用你需要的属性。有good tutorial here和Rails 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=
插入更多数据)
我必须在两个实例中添加正确的行为;正在填充连接模型,允许您调用关联的对象。
你想要的是这样的:
<<
使用我推荐的方法时,摆脱def interest_already_sent
support = Support.find params[:id]
current_user.interests << support
end
列。
您可以通过加入表致电interest
。
使用上面的代码时,它告诉Rails将.interests
对象(IE support
插入support_id
(IE current_user
)user_id
关联(填充了interests
表格。
这基本上会使用UserInterestSelf
user_id
和current_user
support_id
向此表添加新记录。
答案 2 :(得分:-1)
将AR对象转换为哈希使用object.attributes
。
要在模型字段中存储自定义哈希,您可以使用serialize或ActiveRecord::Store
答案 3 :(得分:-1)
您也可以将to_json方法用作 object.to_json
User.find(current_user.id ).to_json # gives a json string