Ruby Sinatra和Datamapper无法将数组保存到数据类型对象

Ruby Sinatra和Datamapper无法将数组保存到数据类型对象,ruby,arrays,object,sinatra,datamapper,Ruby,Arrays,Object,Sinatra,Datamapper,我有一个HTML表单,它使用以下Sinatra代码来处理url“/add artist”的帖子: post '/add-artist' do if logged_in? a = Artist.new a.name = params[:name] a.website = params[:website] a.facebook = params[:facebook] a.created_by = session[:user_id] a.create

我有一个HTML表单,它使用以下Sinatra代码来处理url“/add artist”的帖子:

post '/add-artist' do
  if logged_in?
    a = Artist.new
    a.name = params[:name]
    a.website = params[:website]
    a.facebook = params[:facebook]
    a.created_by = session[:user_id]
    a.created_at = Time.now
    a.updated_by = session[:user_id]
    a_updated_at = Time.now
    a.views = 0
    a.save
    @user = User.get session[:user_id]
    @user.artists.push(a.id)
    @user.save
    redirect '/'
  end
end
正在保存对象“a”,但“@user”未保存。我想更具体地说,“@user.artists”的值没有更新。如果您需要更多信息,请询问,但我感觉您的Ruby老手会在我提供的代码中发现问题

更新


这里有一些额外的信息。我能够在irb中重现错误。首先,这里是我对“User”的类定义

# dm_models.rb
require 'data_mapper'

DataMapper::setup(:default, "sqlite3://#{Dir.pwd}/event_review.db") 

class User
  include DataMapper::Resource

  property :id, Serial
  property :email, String
  property :password, String
  property :user_name, String
  property :birthdate, Date
  property :city, String
  property :state, String
  property :zip, String
  property :geodata, Object
  property :bio, Text
  property :friends, Object
  property :events, Object
  property :event_reviews, Integer
  property :artists, Object
  property :artist_reviews, Integer
  property :venues, Object
  property :venue_reviews, Integer
  property :created_at, DateTime
  property :updated_at, DateTime
  property :views, Integer

  has n, :reviews

end
这是irb

>> require 'sinatra'
=> true
>> require 'data_mapper'
=> true
>> require './models/dm_models.rb'
=> true
>> require 'geokit'
=> true
>> 
?> include Geokit::Geocoders
=> Object
>> u = User.get 8
=> #<User @id=8 @email="km@km.com" @password="km" @user_name="Katherine Miller" @birthdate=#<Date: 4895485/2,0,2299161> @city="Burbank" @state="CA" @zip="91501" @geodata=#<Geokit::GeoLoc:0x10150d4d8 @street_number=nil, @suggested_bounds=#<Geokit::Bounds:0x10150cf88 @sw=#<Geokit::LatLng:0x10150cd80 @lng=-118.315043, @lat=34.1766949>, @ne=#<Geokit::LatLng:0x10150cee8 @lng=-118.27996, @lat=34.221666>>, @lng=-118.2935891, @zip="91501", @state="CA", @precision="zip", @province=nil, @all=[#<Geokit::GeoLoc:0x10150d4d8 ...>], @street_address=nil, @provider="google", @city="Burbank", @lat=34.2039087, @country_code="US", @full_address="Burbank, CA 91501, USA", @street_name=nil, @accuracy=5, @country="USA", @success=true> @bio=<not loaded> @friends=[] @events=["13", "14", "15", "16", "28", "29"] @event_reviews=7 @artists=[] @artist_reviews=1 @venues=[] @venue_reviews=0 @created_at=#<DateTime: 70729968253/28800,-5/24,2299161> @updated_at=#<DateTime: 1178838019/480,-5/24,2299161> @views=56>
>> 
?> u.artists
=> []
>> u.artists.push "5"
=> ["5"]
>> u.save
=> true
>> u = User.get 8
=> #<User @id=8 @email="km@km.com" @password="km" @user_name="Katherine Miller" @birthdate=#<Date: 4895485/2,0,2299161> @city="Burbank" @state="CA" @zip="91501" @geodata=#<Geokit::GeoLoc:0x1014e8638 @street_number=nil, @suggested_bounds=#<Geokit::Bounds:0x1014e80e8 @sw=#<Geokit::LatLng:0x1014e7eb8 @lng=-118.315043, @lat=34.1766949>, @ne=#<Geokit::LatLng:0x1014e8048 @lng=-118.27996, @lat=34.221666>>, @lng=-118.2935891, @zip="91501", @state="CA", @precision="zip", @province=nil, @all=[#<Geokit::GeoLoc:0x1014e8638 ...>], @street_address=nil, @provider="google", @city="Burbank", @lat=34.2039087, @country_code="US", @full_address="Burbank, CA 91501, USA", @street_name=nil, @accuracy=5, @country="USA", @success=true> @bio=<not loaded> @friends=[] @events=["13", "14", "15", "16", "28", "29"] @event_reviews=7 @artists=[] @artist_reviews=1 @venues=[] @venue_reviews=0 @created_at=#<DateTime: 70729968253/28800,-5/24,2299161> @updated_at=#<DateTime: 1178838019/480,-5/24,2299161> @views=56>
>> u.artists
=> []
>> u.artists.class
=> Array
>需要“sinatra”
=>正确
>>需要“数据映射器”
=>正确
>>需要“./models/dm_models.rb”
=>正确
>>需要“地理套件”
=>正确
>> 
?>包括地理套件::地理编码器
=>对象
>>u=User.get 8
=> #
>> 
?>美国艺术家
=> []
>>美国艺术家推出“5”
=> ["5"]
>>美国储蓄
=>正确
>>u=User.get 8
=> #
>>美国艺术家
=> []
>>美国艺术家班
=>阵列
上面代码的描述:我检索id==8的用户,将值“5”放入其中。这似乎是成功的。我保存用户#8。然后我重新检索用户#8并查看美术师值,它是一个空数组

最后,我能够更新其他领域,如“艺术家评论”。这是因为我将艺术家、活动和场地的数据类型定义为“对象”吗?所有这些字段都存在此问题


谢谢你的帮助。

日志怎么说?你能推到@user.artists吗?它是一个数组吗?它可能无法通过验证,您无法完成保存。

我刚才问过这个问题,但我非常确定解决方案是序列化对象。在本例中,它是一个整数数组。我不确定我是否有时间用详细的解决方案来更新它,但是数组不能直接存储在关系数据库中。数组对象必须“序列化”,本质上转换为字符串。在本例中,
artist
属性的数据类型将是
text。

您可以手动将艺术家列转换为数组(从字符串)将新整数推入数组,然后转换回字符串并保存。我假设有一种自动化的方法来做这件事,但这就是我的想法


此外,整个示例是处理关联的糟糕方法。更好的方法是使用一对多关联,其中有一个
ArtistUser
表,该表有两列
artist\u id
user\u id
。在
ArtistUser
表中,每个新关联都表示为一个新行。

我能够在irb中重现错误,因此应该更容易找出。我将用这些信息编辑我的问题。为什么你需要艺术家的对象?看起来你们想要一个数组,你们不能把“5”推到对象中。我假设如果选择Object,则必须使用artist=将对象封送到该属性中。完全公开,我只使用Ruby大约一个月,因此我没有很好的理由使用数据类型“Object”。我在datamapper文档中没有看到任何关于使用数组数据类型的内容,所以我猜在Ruby中数组是一个对象,所以它可能会工作。奇怪的是,到目前为止,它确实存在。我想我只是要改变我试图解决的问题的方法,而不是继续用我的脑袋来对付这个问题。我认为使用“has_n”和“belish_to”协会,我将能够实现我所需要的。