我应该在Rails中使用多传递关联吗?

时间:2018-02-15 16:44:03

标签: ruby-on-rails ruby

我想我的rails应用程序可能需要多传递关联。我需要一些帮助来做出这个决定和实现逻辑。

我有4个型号。

1. User - has_and_belongs_to_many :locations
2. Locations - has_and_belongs_to_many :users
3. Customer - model in question
4. Job - model in question

每个用户都被分配到特定位置,以便用户可以查看客户并编辑与他们相关联的位置的作业。

我认为我需要多次传递关联的部分是我的CustomerJob模型。

基本上,应该有一个客户记录。客户应该在许多地方有很多工作。但是,用户只应在与其关联的位置看到客户。这是让我陷入困境的部分。

更新

试图提出一个想法,也许这种关联会起作用:

User has_and_belongs_to_many :locations
Location has_and_belongs_to_many :users
Customer has_and_belongs_to_many :locations, has_many :jobs
Job belongs_to :customers, belongs_to :locations

然后我可以通过

访问指定位置的所有客户
User has_many :customers, through: :locations
User has_many :jobs, through: :locations

1 个答案:

答案 0 :(得分:2)

  

尽力解释。用户应该能够登录并查看他们工作的所有位置。他们应该能够选择一个位置并查看该位置的所有客户,还可以查看该位置的所有工作(位置可能类似于地区或城市)。用户可能在美国的位置以及加拿大的位置工作,因此如果该用户选择加拿大,那么用户应该只能查看(通过关联)加拿大客户和加拿大的工作

下面的代码可以解决您的问题。

    class User < ActiveRecord::Base
      has_many_and_belongs_to :locations
      has_many :customers, through: :locations
      has_many :jobs, through: :locations
    end

    class Location < ActiveRecord::Base
      has_many_and_belongs_to :users
      has_many_and_belongs_to :customers
      has_many_and_belongs_to :jobs
    end

    class Customer < ActiveRecord::Base
      has_and_belongs_to_many :locations, 
    end

    class Job < ActiveRecord::Base
      has_many_and_belongs_to :locations
    end

现在在控制器中你可以使用:

说params = {region: 'canada'}

@canada_jobs = current_user.jobs.where(locations: {region: params[:region]})
@canada_customers = current_user.customers.where(locations: {region: params[:region]})