1

我对 Rails 相当陌生,并且了解连接和关联的基础知识,但我在如何最好地使用 Rails 进行一些一般查询方面遇到了挑战。我已经查看了很多文档,但仍不清楚此查询的最佳方法。型号如下

用户:

has_many :accounts

帐户:

belongs_to :user
belongs_to :address, :class_name => "Location", :foreign_key => 'address_id' 

地址:

belongs_to :account  (This is really a many to one relationship where an address,
                      can belong to more than one account)

查询是查找用户的所有帐户地址。一个标准的 sql 查询看起来像这样。

SELECT Users.ID AS Users_ID, Users.Username, Account.acct_name, Address.*
FROM Address INNER JOIN (Users INNER JOIN Account ON Users.ID = Account.user_id) 
ON Address.ID = Account.address_id
WHERE (((Users.ID)=2));

在没有直接 sql 查询的情况下,rails 似乎有很多功能可以做到这一点。这样做的最佳方法是什么,模型是否正确?是正确模型中的外键表示。

预先感谢您的协助。

4

2 回答 2

1

首先,根据您所描述的,Address 类可能应该具有关系 has_many :accounts 而不是 belongs_to :account。一般的经验法则是当该模型的表中有一个外键用于belongs_to 表时使用belongs_to。但是对于这个真正无关紧要的查询,因为您是从用户开始的。

像这样的东西应该接近你想要的:

User.where(:id => 2).includes(:accounts => :addresses)

有关详细信息,请参阅Rails 指南。squeel gem 对于更高级的查询功能也很有用。

于 2013-04-15T14:39:11.417 回答
1

您可能正在寻找has_many :through association

class User < AR::B
  has_many :accounts
  has_many :addresses, through: :accounts
end

然后,您可以使用 查询用户的所有地址@user.addresses

如果您想查看 ActiveRecord 为您的查询生成的 SQL 查询,您可以调用.to_sql一个查询:@user.addresses.to_sql.

编辑:关于您的关联设置的其余部分,您需要重新设计地址和帐户的加入方式。一种方法可能是这种方法。

class Account < AR::B
   belongs_to :user
   belongs_to :address # the accounts table should have an address_id integer column
end

class Address < AR::B
  has_many :accounts
end 

有关可以传递给关联的选项的更多信息,请参阅Rails API 文档

于 2013-04-15T14:28:21.533 回答