Ruby on Rails 加入表关联

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 => [ ... ])


您可以向 User 添加一个方法,将每个用户角色的事务收集到一个数组数组中,然后将其展平为一个数组:

1
2
3
4
5
class User < ActiveRecord::Base
  def transactions
    user.roles.collect { |role| role.transactions }.flatten
  end
end