通过rails

时间:2015-07-14 20:44:07

标签: ruby-on-rails ruby-on-rails-4

这会有点长,但我是自学成才,我担心我会犯一些导致很多问题的根本错误 - 所以我会非常彻底

设置(当然简化了 - 我必须更改名称,所以如果你看到一个错字,那不是问题,对不起):

class Deviceapi < ActiveRecord::Base
  belongs_to :devices
end

class Device < ActiveRecord::Base
  has_and_belongs_to_many :users
  has_many :deviceapis
end

class User < ActiveRecord::Base
  has_many :templates, dependent: :destroy
  has_many :designs, through: :templates
  has_many :deviceapis, through: :devices
  has_and_belongs_to_many :devices
end

class Template < ActiveRecord::Base
  belongs_to :user
  has_many :designs, dependent: :destroy
end

class Design < ActiveRecord::Base
  belongs_to :template
end

解释:

我的程序从设备接收数据 - 每个数据条目在我的数据库中创建一个deviceapi条目。然后,模板和设计使用该数据。用户无权访问设备(管理员除外),实际上根本没有人访问设备。

现在,我希望能够编写如下的查询:

class Placement < ActiveRecord::Base
.
.
  # This counts the number of api entries associated with the design
  self.campaign.user.devices.deviceapis.count
end

此外,管理员应该能够根据需要限制用户对设备的访问。哪个应该间接限制对deviceapis的访问,因为它们只能通过设备访问(它们没有任何视图页面或任何东西)。

具体来说,我的架构(简化)显示:

ActiveRecord::Schema.define(version: ################) do
  create_table "deviceapis", force: :cascade do |t|
    t.string   "api_id"
  end

  create_table "devices", force: :cascade do |t|
    t.string   "device_guid"
    t.integer  "user_ids"
  end

  create_table "designs", force: :cascade do |t|
    t.string   "device_id"
  end
end

查询应自动限制为device_guid(device)和api_id(deviceapi)匹配的实例。然后它应该被user_id(设备)进一步限制,匹配user_id(用户的主键)。然后更受限于与device_id(设备的主键)匹配的device_id(设计)。

范围和方法可以在我们让它们工作后处理查询,但我无法让查询做任何事情,只是出现空洞或吐出错误。我想我需要一些连接表或其他东西。

我如何为此构建正确的连接表?还是有一些其他更明显的方法可以做到这一点,我没有看到?我花了很长时间在这上面,而且我在试验中学到了很多东西,但在这个具体问题上并没有真正取得任何进展 - 而且我认为这在其他地方让我感到沮丧。

感谢您的帮助!

1 个答案:

答案 0 :(得分:1)

以下是我认为的问题。

如果你记录下来: Placement.campaign.user.devices你会得到一些结果。 (我不知道PlacementCampaign中的关系,所以我只是在猜测。

在您的控制台中执行此操作:(基于以上假设) Placement.campaign.user.devices.class您应该得到类似的内容:Device::ActiveRecord_Associations_CollectionProxy或类似内容。

您现在无法执行此操作Placement.campaign.user.devices.deviceapi,因为Rails不知道您需要deviceapi哪条记录。

如果您执行此类Placement.campaign.user.devices.first.deviceapi之类的操作,那么如果您Placement.campaign.user.devices.first.deviceapi.class {@ 1}}您应该得到类似Deviceapi之类的东西,那么您也应该得到结果。

使用条件查询deviceapi使用join的数量。

像这样User.joins(devices: (:deviceapis) ).where('users.id = ?', current_user.id).count

我认为你有current_user可用或者你认为它适合的其他条件。

如果有帮助,请告诉我。