Rails中的一对一关联

时间:2012-05-09 14:55:23

标签: ruby-on-rails cucumber

我的业务逻辑如下:我有很多用户。每个用户都可以是请求者或工作者。

这是我在Rails中实现它的方式。我正在使用设计进行身份验证。

class User < ActiveRecord::Base
   devise :database_authenticatable, :registerable, :confirmable,
     :recoverable, :rememberable, :trackable, :validatable
   attr_accessible :name, :email, :password, :password_confirmation, :remember_me, :confirmed_at
   has_one :requester           
end

这是请求者模型。

class Requester < ActiveRecord::Base
   attr_accessible :rating      
   belongs_to :user
   has_many :tasks
end

当我尝试用黄瓜进行测试时,我定义了一种创建多个用户的方法

def create_confirmed_user(name,email,password)
  user = User.new(name: name, email: email, password: password, password_confirmation: password, confirmed_at: DateTime.now)
  user.skip_confirmation!
  user.save
end

并从用户

创建请求者
def create_requester_from_user(email, rating)
  user = User.find_by_email(email)
  requester = Requester.new(rating: rating)
  requester.user = user
  requester.save
  binding.pry #To debug 
  0
end

当我使用pry调试时,我发现requester.user返回了一个用户,但r = Requester.first然后r.user返回nil(我检查r == requester返回true)。这很奇怪。

推测问题来自于未准备测试数据库,我已经运行rake db:test:prepare进行检查,但r.user仍然返回nil。

另一个问题:使用此模型,我是否可以调用user.requester以使请求者属于此用户?

还有一个问题是如何正确实现这种业务逻辑?单表继承(STI)是一个不错的选择吗?自从我用谷歌搜索后发现使用STI有很多不良副作用。

2 个答案:

答案 0 :(得分:1)

我相信你想要一个多态关联 http://guides.rubyonrails.org/association_basics.html

答案 1 :(得分:0)

我已经从这篇文章中发现了问题Using build with a has_one association in rails:我修改了模型而没有创建迁移。我需要在将belongs_to添加到我的请求者模型后运行此迁移:rails generate migration add_user_id_to_requester user_id:integer。令人惊讶的是,许多文件都没有提到这一点。