Rails多对多存在查询

dan*_*anh 5 ruby sql activerecord ruby-on-rails

ruby-noob活动记录查询问题的种类:

Magazine
  has_many :subscriptions

User
  has_many :subscriptions

Subscription
  belongs_to :user
  belongs_to :magazine
Run Code Online (Sandbox Code Playgroud)

在控制器中,我想有效地询问current_user是否订阅a_magazine。我认为应该是以下内容...

Subscription.where("user_id = ? and magazine_id = ?", current_user.id, a_magazine.id).count > 0
Run Code Online (Sandbox Code Playgroud)

a)看起来正确吗?b)是否有更有效的方法(假设FK上有索引)c)从风格上来说,是否有更可接受或更简洁的方法?

提前致谢...

tad*_*man 4

更简洁的方法是使用声明查询的哈希方法,这种方法更容易阅读并且出错的机会更少:

Subscription.where(:user_id => current_user.id, :magazine_id => a_magazine.id).any?
Run Code Online (Sandbox Code Playgroud)

您还可以:through根据用户或杂志相应地添加要检查的关系。

class User < ActiveRecord::Base
  has_many :subscriptions
  has_many :magazines, :through => :subscriptions
end
Run Code Online (Sandbox Code Playgroud)

这使得匹配测试变得非常容易:

user = User.find(1)
user.magazines.where(:magazine_id => magazine_id).any?
Run Code Online (Sandbox Code Playgroud)