Ruby on rails 如何创建具有多个复杂关联/联接的Rails模型?
我试图找出如何创建具有关联的ActiveRecord模型,这些关联可以产生与此SQL查询相同的结果:Ruby on rails 如何创建具有多个复杂关联/联接的Rails模型?,ruby-on-rails,activerecord,associations,join,Ruby On Rails,Activerecord,Associations,Join,我试图找出如何创建具有关联的ActiveRecord模型,这些关联可以产生与此SQL查询相同的结果: SELECT login, first_name, last_name, email_address FROM accounts INNER JOIN people ON person.id = accounts.person_id INNER JOIN email_address_people ON person.id = email_address_people.person_id I
SELECT login, first_name, last_name, email_address
FROM accounts
INNER JOIN people ON person.id = accounts.person_id
INNER JOIN email_address_people ON person.id = email_address_people.person_id
INNER JOIN email_addresses ON email_address.id = email_address_people.email_address_id
INNER JOIN email_address_types ON email_address_types.id = email_address_people.email_address_type_id
WHERE email_address_types.email_address_type = 'account';
表结构如下所示,并假设每个表都有一个符合正常ActiveRecord约定的id
:
账户id:int
人员id:int
登录名:string 人
id:int
第一个名称:字符串
姓氏:string 电子邮件地址\u人
id:int
人员id:int
电子邮件地址\u id:int
电子邮件地址类型id:int 电子邮件地址
id:int
电子邮件地址:string 电子邮件地址类型
id:int
电子邮件地址类型:字符串 我需要这些模型具有完整的功能,并且不受诸如:find_by_sql之类的限制 我如何创建使之成为可能的关联模型 谢谢
克里斯·本森
chris@chrisbenson.com我认为最好的做法是首先向您提供文档:
查找“has\u many”(注意:通过)和“belown\u to”以及“has\u one”,尽管我认为您不会使用后面的选项。
将帮助你们完成很多:通过概念——我想在那个之后,你们就可以开始了。如果有什么不清楚的地方,请告诉我们
class Account < ActiveRecord::Base
belongs_to :person
end
class Person < ActiveRecord::Base
has_many :accounts
has_many :email_addresses :through => :email_address_people
end
class EmailAddress < ActiveRecord::Base
belongs_to :email_address_type
belongs_to :person
has_one :email_address_type
end
class EmailAddressType < ActiveRecord::Base
has_many :email_addresses :through => :email_address_people
end
类帐户:电子邮件地址\u人
结束
类EmailAddress:电子邮件地址\u人
结束
我会从那开始。它没有经过测试,但是如果我们看到了什么中断,那么我们可以修复它:) 试试这个:
您的模型类:
class EmailAddress < ActiveRecord::Base
end
class EmailAddressType < ActiveRecord::Base
end
class People < ActiveRecord::Base
has_many :accounts
has_many :email_address_people
has_many :email_addresses, :through => :email_address_people
has_many :account_email_address_people,
:class_name => "EmailAddressPeople",
:conditions => "email_address_type = 'account'"
has_many :account_email_addresses,
:through => :account_email_address_people
end
class EmailAddressPeople < ActiveRecord::Base
belongs_to :person
belongs_to :email_address
belongs_to :email_address_type
end
class EmailAddress:电子邮件地址\u人
有很多:帐户、电子邮件、地址、人、,
:class_name=>“EmailAddressPeople”,
:条件=>“电子邮件地址\类型='帐户'
有很多:帐户、电子邮件地址、,
:通过=>:帐户\电子邮件\地址\人员
结束
类EmailAddressPeople
您的帐户模式:
class Account < ActiveRecord::Base
belongs_to :person
# now to the actual method
def account_emails
person.account_email_addresses.map do |email|
[login, person.first_name, person.last_name, email.email_address]
end
end
# Brute force SQL if you prefer
def account_emails2
sql = "YOUR SQL HERE"
self.connection.select_values(sql)
end
end
类帐户
假设您手头有Account对象,Account.Account\u电子邮件会进行两次数据库调用:
- 使用id获取此人
- 为此人获取帐户电子邮件
直接进入数据库(即
帐户。帐户\u电子邮件2
)是最快的选择,但不是Rails方式。谢谢,但我已经这样做了。熟悉所有这些功能-属于、有一个、HABTM、HM:T。已经使用了所有功能,但不知道如何正确使用这些功能。在网上还没有找到任何适合这种复杂连接的例子。可以使用一些示例模型代码,显示至少4-5个已连接的规范化表,并在标准查询中使用它们。编辑了我的答案(不确定是否会提醒您)。