首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >重写has_one的赋值方法

重写has_one的赋值方法
EN

Stack Overflow用户
提问于 2010-09-25 01:06:47
回答 2查看 539关注 0票数 0

我有一个has_one关联,它反映在另一个关联的对象上。我有一个项目,它有很多ProjectUsers,将项目和用户联系在一起。其中一个ProjectUsers是权威的。问题是has_one和has_many在project_users上使用相同的外键。以下是这些模型的基本思想。

代码语言:javascript
复制
class Project < ActiveRecord::Base
  has_many :project_users, :class_name => 'ProjectUser', :foreign_key => 'project_id'
  has_one :authoritative_user, :class_name => 'ProjectUser', :foreign_key => 'project_id', :conditions => {:authoritative => true}
end

class ProjectUser < ActiveRecord::Base
  belongs_to :project
  belongs_to :user
  # has a boolean column 'authoritative'
end

我想要做的是调用类似这样的东西。

代码语言:javascript
复制
project = Project.new
project_user = ProjectUser.new
project.project_users << project_user
project.authoritative_user = project_user
other_project_user = ProjectUser.new
project.project_users << other_project_user
project.authoriative_user = other_project_user

其中,authoritative_user=会将项目用户更新为将authoritative设置为true,并将前一个权威用户的authoritative设置为false。我遇到的另一个问题是,我第二次在项目上设置authoritative_user时,前一个ProjectUser上的project_id被设置为零,因此它通过项目的project_users不再关联。

我不确定是我做得完全错了,还是我错过了什么。

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2010-09-25 05:44:06

代码语言:javascript
复制
class Project < ActiveRecord::Base
  has_many :project_users
  has_many :users, :through => :project_users

  belongs_to :authoritative_project_user, :class_name => 'ProjectUser'
  has_one    :authoritative_user, :through :authoritative_project_user
end

class  ProjectUser < ActiveRecord::Base
  belongs_to :project
  belongs_to :user

  has_one :project_as_authorized_user
end

然后让has_one project_as_authorized_user关系将你的belongs_to authorized_project_user归零

票数 3
EN

Stack Overflow用户

发布于 2010-09-25 02:48:32

就我个人而言,我可能会考虑简化/分离关注点。下面是一个示例(注意:未测试):

代码语言:javascript
复制
class Project < ActiveRecord::Base
  has_many :project_users
  has_many :users, :through => :project_users
  has_one :authoritative_user
end

class  ProjectUser < ActiveRecord::Base
  belongs_to :project
  belongs_to :user
end

class AuthoritativeUser < ActiveRecord::Base
  belongs_to :project
  belongs_to :user

  validates_uniqueness_of :user_id, :scope => :project_id
end

实际上,我将ProjectUser模型的authoritative_user属性分解为它自己的属性。非常简单,干净,并不是很令人兴奋。

您可以在Project模型中构建一些方便的方法,如has_authoritative_user?update_authoritative_user

我相信你会得到一些更好的建议。

希望这能有所帮助!

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/3789364

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档