我希望我的Rails应用发送新闻通讯。我首先实现了它,以便用户可以订阅和接收新闻通讯。但是现在,我希望不是用户的人也能够加入新闻通讯。因此,我创建了一个新模型:NewsletterSubscribers。
我现在要运行的是,我想确保每当有人第一次加入时事通讯并后来注册一个帐户时,他不会两次收到该时事通讯。
我怀疑该如何进行。我看到两个选项:
如您所见,我被困住了……有人知道如何最好地解决这个问题吗?
ps。我将Devise与Twitter omniauth结合使用来对用户进行身份验证。希望让您知道,以防万一这简化或使可能的解决方案复杂化。
您可以通过传递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