gpt4 book ai didi

ruby-on-rails - Rails ActiveRecord 协会

转载 作者:数据小太阳 更新时间:2023-10-29 08:41:10 24 4
gpt4 key购买 nike

好的,这是我的问题。我有 3 种不同的模型,人员、角色、客户和商店。客户有很多商店,也可以有很多人。商店有很多人。人有不同的角色。 1 人可以在多家门店工作,在每家门店可能担任不同的角色。

例如。 Joe 可能是一家商店的助理经理和另一家商店的经理。我希望能够做的是通过执行类似

Store.find(1).people.find(1).roles
的操作来提取正确的角色(例如会返回 'assistant manager')或

Store.find(2).people.find(1).roles
(例如会返回“经理”)。这可以在 ActiveRecord 中完成吗?

我创建了一个表 :roles_people ,其定义如下:

create_table :roles_people, :id => false do |t|      t.references :role      t.references :person      t.references :store      t.references :clientend

但是我无法弄清楚如何使用此表使关联正常工作。谁能指出我正确的方向?

谢谢

最佳答案

class People
belongs_to :client
has_many :store_roles
end

class Roles
has_many :store_roles
end

class StoreRole
belongs_to :role
belongs_to :people
belongs_to :store
end

class Client
has_many :stores
has_many :people
end

class Store
belongs_to :client
has_many :store_roles
has_many :roles, :through => :store_roles
end

假设所有这些类都继承自 ActiveRecord::Base ;)

您将需要设置迁移和数据库结构以反射(reflect)这些关系。对于每个 belongs_to,表上都有一个 :object_id 字段引用相应表的 ID。

您的查询需要类似于:

Store.find(1).roles.find(:all, :conditions => ["store_roles.person_id = ?", 1])

我可能会在商店模型中添加一个方法,使这更容易一些:

def roles_for(person_id)
roles.find(:all, :conditions => ["store_roles.person_id = ?", person_id])
end

这样你就可以找到角色:

Store.find(1).roles_for(1)

或者,更好的是:

def self.roles_for(store_id, person_id)
Role.find(:all, :joins => :store_roles, :conditions => ["store_roles.store_id = ? AND store_roles.person_id = ?", store_id, person_id])
end

这将我们的查找器更改为:

Store.roles_for(1, 1)

我会说最后一种方法是最理想的,因为它只会导致一个查询,而其他每个选项都会针对每个角色查找对数据库执行两个查询(一个用于查找商店,一个用于获取person_id 的角色)。当然,如果您已经实例化了 Store 对象,那么这没什么大不了的。

希望这个答案足够了:)

关于ruby-on-rails - Rails ActiveRecord 协会,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/5212741/

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