Ruby on Rails Join Table Associations
我有一个像这样的 Ruby on Rails 应用程序设置:
用户模型
|
1
|
has_and_belongs_to_many :roles
|
榜样
|
1
2 |
has_many :transactions
has_and_belongs_to_many :users |
交易模型
|
1
|
belongs_to :role
|
这意味着使用了一个名为roles_users的连接表,也意味着用户只能看到通过角色分配给他们的事务,用法示例:
|
1
2 |
user = User.find(1)
transactions = user.roles.first.transactions |
这将返回与分配给用户的第一个角色相关联的事务。如果用户有 2 个角色分配给他们,目前要获取与第二个角色关联的事务,我会这样做:
|
1
|
transactions = user.roles.last.transactions
|
我基本上是想找到一种方法来建立关联,这样我就可以根据用户和角色之间的关联中定义的角色通过类似的方式获取用户的交易:
|
1
2 |
user = User.find(1)
transactions = user.transactions |
我不确定这是否可能?我希望你明白我想要做什么。
如果您不想执行单独的 SQL 查询来查找每个角色的事务,您可以先获取用户的 role_ids,然后使用单个查询查找具有这些角色 id 的所有事务:
|
1
2 3 4 5 6 |
class User < ActiveRecord::Base
#… def transactions Transaction.scoped(:conditions => {:role_id => role_ids}) end end |
Transaction.scoped 在这里使用,因此您可以在必要时添加更多条件,例如
|
1
|
user.transactions.all(:limit => 10, :conditions => [ … ])
|
- Voyta 的回答比我的要好。此外,有关使用 scoped 的更多信息,请参阅此博客文章:ryandaigle.com/articles/2008/3/24/…
您可以向 User 添加一个方法,将每个用户角色的事务收集到一个数组数组中,然后将其展平为一个数组:
|
1
2 3 4 5 |
class User < ActiveRecord::Base
def transactions user.roles.collect { |role| role.transactions }.flatten end end |
来源:https://www.codenong.com/2802539/
