1

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

这就是我在 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

当我尝试用 cucumber 测试它时,我定义了一个方法来创建多个用户

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 有很多不好的副作用。

4

2 回答 2

1

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

于 2012-05-09T15:17:24.503 回答
0

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

于 2012-05-10T04:08:35.233 回答