我有一个Ruby on rails应用程序,用户可以在其中添加一个或多个软件。 然后,这些用户可以订阅(付费模式)。
我希望能够只显示所有付费用户软件。
我尝试了几件事但仍无法找到解决方案。
例如:
Software.includes(:users).where(user: {subscribed: true})
编辑:
型号USER:
class User < ActiveRecord::Base
has_many :softwares
end
模型软件:
class Software < ActiveRecord::Base
belongs_to :user
end
JoinTable
class CreateJoinTableUsersSoftwares < ActiveRecord::Migration[5.2]
def change
create_join_table :users, :softwares do |t|
t.index [:user_id, :software_id]
t.index [:software_id, :user_id]
end
end
end
错误:
Software.includes(:users).where(user: {subscribed: true})
ActiveRecord::ConfigurationError (Can't join 'Software' to association named 'users'; perhaps you misspelled it?)
答案 0 :(得分:2)
我认为你的错误就在这里:
Software.includes(:users).where(user: {subscribed: true})
includes
应反映关联,在本例中为单数user
。这就是造成您所看到错误的原因。
此外,它是一个常见问题,但where
子句中的关联需要使用表名。
试试这个:
Software.includes(:user).where(users: { subscribed: true })
这假设您将在user
处使用其他地方的信息,即在您的视图中。如果您不需要访问记录,只需查看user
查询,就可以将includes
切换为joins
以提高查询的效率:
Software.joins(:user).where(users: { subscribed: true })
这是一个单独的主题,但有一个很好的阅读here。