从一种或两种模式管理新闻通讯订阅者? -Rails 5

问题描述 投票:0回答:1

我希望我的Rails应用发送新闻通讯。我首先实现了它,以便用户可以订阅和接收新闻通讯。但是现在,我希望不是用户的人也能够加入新闻通讯。因此,我创建了一个新模型:NewsletterSubscribers。

我现在要运行的是,我想确保每当有人第一次加入时事通讯并后来注册一个帐户时,他不会两次收到该时事通讯。

我怀疑该如何进行。我看到两个选项:

  • 将其发送给NewsLetterSubscribers,然后再将其发送给用户之前,检查NewsletterSubscriber表的记录中是否存在他们的电子邮件。如果存在,则不要再次将其发送到该电子邮件。我担心的是,这非常慢。同样,用两个模型来管理我的新闻通讯订阅也是一种不好的做法。
  • 仅从NewsletterSubscriber模型管理新闻通讯。每个人都可以订阅(访问者和用户)。这样可以简化很多操作,但是我希望能够在我的视图中检查用户是否订阅了新闻通讯。因此,那么我需要NewsletterSubscriber和Users之间的belongs_to-has_many关联。但是随后,由于该关联附带的验证,访问者无法再订阅。

如您所见,我被困住了……有人知道如何最好地解决这个问题吗?

ps。我将Devise与Twitter omniauth结合使用来对用户进行身份验证。希望让您知道,以防万一这简化或使可能的解决方案复杂化。

ruby-on-rails devise associations
1个回答
1
投票

您可以通过传递belongs_to选项来禁用由optional: true生成的验证:

class User < ApplicationRecord
  has_many :newsletter_subscriptions
  # or 
  has_one :newsletter_subscription
end

class NewsletterSubscription < ApplicationRecord
  belongs_to :user, optional: :true
end

您可能要考虑的另一种方法是使用单表继承(STI),这将使您在仍使用单个表的同时为来宾和已注册订阅创建不同的逻辑。您可以通过在type表中添加一个名为newsletter_subscriptions的字符串列来进行设置。

# rails g model NewsletterSubscription type:string email:string user:references
class NewsletterSubscription < ApplicationRecord
  # shared logic
end

# app/models/users/newsletter_subscription.rb
module Users
  class NewsletterSubscription < ::NewsletterSubscription
    belongs_to :user
    delegate :email, to: :user
  end
end
# app/models/guests/newsletter_subscription.rb
module Guests
  class NewsletterSubscription < ::NewsletterSubscription
    validates_presence_of :email
  end
end
© www.soinside.com 2019 - 2024. All rights reserved.