Ruby on Rails加入表关联

时间:2010-05-10 12:25:33

标签: ruby-on-rails ruby activerecord associations

我有类似的Ruby on Rails应用程序设置:

用户模型

has_and_belongs_to_many :roles

角色模型

has_many :transactions
has_and_belongs_to_many :users

交易模型

belongs_to :role

这意味着使用名为roles_users的连接表,这也意味着用户只能看到通过角色分配给他们的事务,用法示例:

user = User.find(1)
transactions = user.roles.first.transactions

这将返回与分配给用户的第一个角色关联的事务。如果用户分配了2个角色,那么为了获得与第二个角色关联的事务,我会这样做:

transactions = user.roles.last.transactions

我基本上试图找到一种设置关联的方法,这样我就可以根据用户和角色之间关联中定义的角色通过类似的方式获取用户的事务:

user = User.find(1)
transactions = user.transactions

我不确定这是否可行?我希望你明白我要做的事。

2 个答案:

答案 0 :(得分:1)

如果您不想执行单独的SQL查询来查找每个角色的事务,您可以先为该用户获取role_ids,然后使用单个查询查找具有这些角色ID的所有事务:

class User < ActiveRecord::Base
  #...
  def transactions
    Transaction.scoped(:conditions => {:role_id => role_ids})
  end
end
此处使用了

Transaction.scoped,因此您可以在必要时添加更多条件,例如

user.transactions.all(:limit => 10, :conditions => [ ... ])

答案 1 :(得分:0)

您可以将Usercollect每个用户角色的事务的方法添加到数组中,然后将flatten添加到单个数组中:

class User < ActiveRecord::Base
  def transactions
    user.roles.collect { |role| role.transactions }.flatten
  end
end