Rails关联关联的范围

时间:2016-07-18 20:31:51

标签: ruby-on-rails activerecord

快速提问。 我正在尝试建立一个没有成功的范围。我有这些模型

class User < ActiveRecord::Base

 belongs_to :store, required: true
has_many :visits
has_one :company, through: :store

end

class Store < ActiveRecord::Base
  belongs_to :company, required: true
  has_many :users, dependent: :nullify
end

class Company < ActiveRecord::Base
  has_many :stores, dependent: :destroy
  has_many :users, through: :stores
end

class Visit < ActiveRecord::Base
  belongs_to :user
end

修改

现在我需要使用Chartkick Gem绘制一些图表,最好的方法是从Visit模型开始。

我正在使用

Visit.group_by_day("started_at", range: 3.month.ago.midnight..Date.today.midnight, format: "%b %-e").order("day asc").count

如果我需要所有访问,但现在我还要过滤公司和商店的访问。

我无法理解如何从属于特定商店或特定公司的用户获得所有访问权限。

最简单的方法是:

Visit.where("user_id IN (?)", company.users.ids)  

它有效,但我想要写一个更好的范围,我写的那个不起作用。

  class Visit < ActiveRecord::Base
  belongs_to :user

  scope :user_by_store, ->(store_id) {
    joins(:user).where('user.store_id' => store_id) 
  }
end

2 个答案:

答案 0 :(得分:3)

我认为你应该可以做到:

scope :by_company, -> (company) { joins(:company).where(company: {id: company}) }

答案 1 :(得分:0)

在方法where中添加“ user.store_id”时,您正在使用SQL。根据Rails标准,表的名称通常为复数

您唯一需要在代码中修复的就是更改user-> users

scope :user_by_store, ->(store_id) {
  joins(:user).where('users.store_id' => store_id) 
}

当然,对于按公司进行过滤,您可以使用@oreoluwa的答案,但可以修复表名中的相同错误。

scope :by_company, -> (company) { joins(:company).where(companies: {id: company}) }