Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/ruby-on-rails/59.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Ruby on rails 如何创建具有多个复杂关联/联接的Rails模型?_Ruby On Rails_Activerecord_Associations_Join - Fatal编程技术网

Ruby on rails 如何创建具有多个复杂关联/联接的Rails模型?

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

我试图找出如何创建具有关联的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 
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个已连接的规范化表,并在标准查询中使用它们。编辑了我的答案(不确定是否会提醒您)。