【问题标题】:default scope with condition带条件的默认范围
【发布时间】:2013-08-15 19:42:42
【问题描述】:

我正在使用 rails 3.2.13 和 ruby​​ 1.9.3。 我有三个模型:- 电子邮件 用户

我有 2 个用户角色 => 发布者或订阅者

如果我想为订阅者和发布者提供电子邮件,我想知道如何在 Rails 中做到这一点。 比如,我只是写 电子邮件.find(####).publishers Email.find(####).subscribers

没有为 subs 和 pubs 设置不同的表。 另外,我在电子邮件和用户之间有很多直通关系。

另外,我想实现 email.publishers.approved 的默认范围?应该对用户可见,其他人应该隐藏。

【问题讨论】:

  • 我得到的是你有 3 个模型 Email , User 和 EmailUser。电子邮件通过 EmailUser 模型拥有许多用户。是吗?
  • 是的,用户有角色 => 发布者 ||订阅者

标签: ruby-on-rails-3 activerecord associations has-many-through


【解决方案1】:

这样做的方法是在 EmailUser 模型中设置字段“角色”。

然后在Email模型中添加以下两个方法:

def publishers
  self.users.where(:email_users=>{:role=>'Publishers'})
end

def subscribers
  self.users.where(:email_users=>{:role=>'Subscribers'})
end

【讨论】:

  • 这不是默认范围解决方案,我如何限制来自未经批准的发布者的电子邮件??
  • 默认范围是什么意思?? Rails 鼓励使用方法。无论如何,添加另一种过滤已批准的方法。我想如果我给了这个,你会写那个。试试看。
  • 我实际上想使用 DRY,所以我将限制写在一个地方,不需要写在任何其他地方,这样它就限制了接收特定类型的电子邮件,如果我有url abc.com.users/emails/112 用户可以输入 113 并可以通过使用方法查看另一封电子邮件,但如果我使用默认范围,该电子邮件将不存在显示
【解决方案2】:

你可以这样做。

class Email < ActiveRecord::Base
   has_many :email_users
   has_many :users, :through => :email_users

   scope :approved, where(approved: true )
   scope :publishers, joins(:email_users => :user).where(:users => {:role => "publisher"})
   scope :subscribers, joins(:email_users => :user).where(:users => {:role => "subscriber"})


end

class EmailUser < ActiveRecord::Base
  belongs_to :email
  belongs_to :user
end

class User < ActiveRecord::Base
   has_many :email_users
   has_many :emails, :through => :email_users

   scope :publisher, where(:role => "publisher" )
   scope :subscriber, where(:role => "subscriber" )
end

然后,您可以像这样简单地从发布商那里获得批准的电子邮件。

Email.publishers.approved

并从订阅者那里获得电子邮件。

Email.subscribers

并从出版商那里获得电子邮件。

Email.publishers

【讨论】:

  • 是你需要的吗?
猜你喜欢
  • 2012-10-28
  • 1970-01-01
  • 2011-09-02
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多