2015-09-29 78 views
2

我有三個模型RoleActionRoleAction一些代碼:Rails的HAS_MANY通過條件方面

class Role < ActiveRecord::Base 
    has_many :users 
    has_many :actions, -> {where role_actions:{status: 1}}, :through => :roleActions 
    has_many :actions, :through => :roleActions #other context(manager, etc...) 
    has_many :roleActions 
end 

class Action < ActiveRecord::Base 
    has_many :actions, foreign_key: 'parent_id' 
    has_many :roleActions 
    has_many :roles, through: :roleActions 
end 

class RoleAction < ActiveRecord::Base 
    belongs_to :role 
    belongs_to :action 
end 

當我使用role.actions將得到role行動,並在role_actions status == 1

但我想當我使用role.actions("manager")(與「經理」是上下文名稱)將返回角色的所有行動。

我該怎麼辦?

謝謝!

+0

http://stackoverflow.com/questions/408872/ rails-has-many-through-find-by-extra-attributes-in-join-model – lokson

+0

你可以用'role.actions.where(name_of_attribute:'manager')'來實現。其中name_of_attribute是存儲「manager」值的屬性名稱 –

回答

1
  1. 你必須保持你的協會snake_case
  2. 你不能有多個同名協會(IE actions

這裏就是我想要做的:

#app/models/role.rb 
class Role < ActiveRecord::Base 
    has_many :role_actions 
    has_many :actions, through: :role_actions do 
     def status(val) 
     { where status: val } # @role.actions.status(1) 
     end 
    end 
end 

#app/models/role_action.rb 
class RoleAction < ActiveRecord::Base 
    belongs_to :role 
    bleongs_to :action 
end 

#app/models/action.rb 
class Action < ActiveRecord::Base 
    has_many :role_actions 
    has_many :actions, through: :role_actions 
end 

您需要在Rails中查找scopes - 在您的關聯查詢中定義條件是一種不好的做法,只是爲了打破它。有些人會稱之爲antipattern

-

如果你有「裸」聯想,你就可以作用域不過你想要的。您也可以使用ActiveRecord association extensions爲您的關聯本身提供特定功能(如上所示)。

role.actions("manager")

這可以通過簡單地調用Role對象仰視經理值時可以實現:

@role = Role.find_by name: "manager" 
@role.actions #-> all actions for the "manager" role.