这会有点长,但我是自学成才,我担心我会犯一些导致很多问题的根本错误 - 所以我会非常彻底
设置(当然简化了 - 我必须更改名称,所以如果你看到一个错字,那不是问题,对不起):
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(设计)。
范围和方法可以在我们让它们工作后处理查询,但我无法让查询做任何事情,只是出现空洞或吐出错误。我想我需要一些连接表或其他东西。
我如何为此构建正确的连接表?还是有一些其他更明显的方法可以做到这一点,我没有看到?我花了很长时间在这上面,而且我在试验中学到了很多东西,但在这个具体问题上并没有真正取得任何进展 - 而且我认为这在其他地方让我感到沮丧。
感谢您的帮助!
答案 0 :(得分:1)
以下是我认为的问题。
如果你记录下来:
Placement.campaign.user.devices
你会得到一些结果。 (我不知道Placement
和Campaign
中的关系,所以我只是在猜测。
在您的控制台中执行此操作:(基于以上假设)
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
可用或者你认为它适合的其他条件。
如果有帮助,请告诉我。