gpt4 book ai didi

ruby-on-rails - rails has_one 通过一个集合

转载 作者:行者123 更新时间:2023-12-04 03:46:53 25 4
gpt4 key购买 nike

我将首先粘贴相关代码,然后我将在稍后解释我正在尝试做什么

class User < ActiveRecord::Base
has_many :compus, :dependent => :destroy
has_many :companies, :through => :compus
end

class Company < ActiveRecord::Base
has_many :compus, :dependent => :destroy
has_many :employees, :through => :compus, :source => :user
has_one :owner, :through => :compus, :source => :user, :conditions => { :owner => true }
end

class Compu < ActiveRecord::Base
belongs_to :company
belongs_to :user
end

compus 表有以下列(从迁移中复制)
create_table :compus do |t|
t.references :company
t.references :user
t.string :job_title
t.boolean :owner, null: false, default: false

t.timestamps
end

因此,如您所见,我有一个用户可以创建 n 家公司并在 n 家公司工作,在公司工作并不意味着他是所有者。

我想得到的是:

user.companies #=> 用户创建的公司或在其工作的公司(我担心稍后过滤结果)

company.employees #=> 在这家公司有工作的所有用户(通过 compus)

company.owner #=> 最初创建公司的一个用户(或另一个用户,如果后来转移)

所以我在写上面的代码之前添加了以下规范。
it "has one owner" do
company = Factory(:company)
user = Factory(:user)

company.should respond_to(:owner)

user.companies << company

company.owner.should === user
end

但我收到以下错误:
ActiveRecord::HasOneThroughCantAssociateThroughCollection:
Cannot have a has_one :through association 'Company#owner' where the :through association 'Company#compus' is a collection. Specify a has_one or belongs_to association in the :through option instead.

那么如何在不向公司表中添加更多列的情况下解决此问题,如果我在公司表上添加 owner_id 会更容易,但这会导致数据库中的重复,通常如果用户创建了公司,则意味着他在它

我在做的另一个问题是,如何通过关联轻松访问 compus 表上的 :job_title?

最佳答案

你可以做一个函数来返回所有者

def owner
compus.where(:owner => true).first
end

在数据库设计方面,如果您想将公司限制为一个所有者,最好在公司表中放置一个 owner_id 列。否则,您必须始终强制他们始终是一个所有者,这将更加复杂。

关于ruby-on-rails - rails has_one 通过一个集合,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/6479319/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com