0

特定の基準が満たされたときにユーザー通知を送信するレールアプリケーションがあります。私はレーキの仕事を通してこれを行うことができます。現在、基準を満たしているレコードを選択して特定の住所にメールで送ることができます。問題は、すべてのアカウントのすべてのレコードを送信することです。ここで私はrakeタスクを持っているものです。ここでRailsアプリケーションで基準が満たされた場合にアカウント内の複数のユーザーに電子メールを送信

task :send_reminds => :environment do 
    equipment = Equipment.where("calibration_date <= ?", Date.today) 
    EquipmentMailer.out_of_calibration(equipment).deliver 
end 

は私EquipmentMailerのためのコードは次のとおりです。ここで

class EquipmentMailer < ActionMailer::Base 
    default :from => "[email protected]" 

    def out_of_calibration(equipment) 
    @equipment = Equipment.where("calibration_date <= ?", Date.today) 
    mail(:to => "[email protected]", :subject => "Equipment is out of calibration") 
    end 
end 

は私のHTML形式の電子メールのためのコードは(期待どおりに動作する)である:

The following Equipment is Due: 
<br></br> 
<table> 
    <tr> 
    <th>Equipment Name</th> 
    <th> </th> 
    <th>Calibration Due Date</th> 
    </tr> 
    <% @equipment.each do |equipment| %> 
    <tr> 
    <td><%= equipment.equipment_id %></td> 
    <td> </td> 
    <td><%= equipment.calibration_date %></td> 
    </tr> 
<% end %> 
</table> 

ご覧のとおり、私は自分宛にメールを直接送信し、その条件を満たす機器リストを受け取っています。しかし、それは当然容認できません。私は校正外の機器を持つアカウント内のすべてのユーザに電子メールを送りたいと思う。ここに私のモデルは以下のとおりです。

class Account < ActiveRecord::Base 
    attr_accessible :subdomain, :email 
    VALID_SUBDOMAIN_REGEX = /\A[\w+\-.]+(-[a-z\d])+(-[a-z\d])/i 
    VALID_EMAIL_REGEX = /\A[\w+\-.][email protected][a-z\d\-.]+\.[a-z]+\z/i 
    validates :subdomain, :presence => true, 
      :uniqueness => true 
    validates :email, :presence => true, 
      format: { with: VALID_EMAIL_REGEX } 

    validates_presence_of :plan_id 

    belongs_to :plan 

    has_many :users 
    has_many :equipment, :through => :users 

    before_save { |account| account.subdomain = account.subdomain.downcase } 
end 

Account.rb

Equipment.rb

class Equipment < ActiveRecord::Base 
    acts_as_tenant(:account) 

    validates :equipment_id, presence: true 
    validates :location, presence: true 

    validates_uniqueness_to_tenant :serial_number 

    has_many :assets, :dependent => :destroy 
    accepts_nested_attributes_for :assets, :allow_destroy => true 

    has_paper_trail 


def self.text_search(query) 
    if query.present? 
    search(query) 
    else 
     scoped 
    end 
end 

User.rb

class User < ActiveRecord::Base 
    acts_as_tenant(:account) 
    validates_uniqueness_to_tenant :email 

    attr_accessible :name, :email, :password, :password_confirmation, :title, :company, 
            :phone, :mobile,  :admin 
    has_secure_password 
    before_save :create_remember_token 

    belongs_to :account 

    validates :name, presence: true, length: { maximum: 50 } 
    VALID_EMAIL_REGEX = /\A[\w+\-.][email protected][a-z\d\-.]+\.[a-z]+\z/i 
    validates :email, presence: true, 
       format:  { with: VALID_EMAIL_REGEX } 
    validates :password, length: { minimum: 6 } 
    validates :password_confirmation, presence: true 

# has_paper_trail 

    private 

    def create_remember_token 
     self.remember_token = SecureRandom.urlsafe_base64 
    end 
end 

私は(メールにこのような何かを試してみました: to => user.email)を直接アドレスの代わりに使用することができますが、機器リストはアカウントとそのユーザに固有のものに限定されます。

@equipment = Equipment.where("calibration_date <= ?", Date.today) 
    @equipment.each do |equipment| 
    equipment.accounts.each do |account| 
     accounts.users.each do |user| 
     user.email.each do |email| 
      mail(:to => email, :subject => "Equipment is out of calibration" 
     end 
     end 
    end 
    end 

レーキタスクはエラーなく実行されますが、メールは受信されません。思考?ところで、私はレールに約1ヶ月しかないので、もし私が何か非常に初歩的なことを逃しているなら、あなたは私を許さなければならないでしょう。

答えて

0

私の推測では、あなたがすべてでそのメソッドに渡される引数を使用していない

def out_of_calibration(equipment) 
    @equipment = Equipment.where("calibration_date <= ?", Date.today) 
    mail(:to => "[email protected]", :subject => "Equipment is out of calibration") 
    end 

問題は、このコードに住んでいるということです。

+0

正しいです。私は "[email protected]"を "user.email"のようなものに置き換える必要がありますが、equipment_date <= Date.todayのときにアカウントにあるequipment_date <= Date.today。 –

0

あなたの団体は正しく見えません。アカウントにはhave_many機器があり、アカウントにhave_manyユーザが必要です。ユーザーはアカウントに属し、機器はアカウントに属している必要があります。機器は複数のアカウントに属しますか?意味がありません。私は以下を提案します:

class Account < ActiveRecord::Base 
has_many :users 
has_many :equipments 
end 

class User < ActiveRecord::Base 
    belongs_to :account 
end 

class Equipment < ActiveRecord::Base 
    belongs_to :account 
    has_many :equipments, :through => :account 
end 

@equipment = Equipment.where("calibration_date <= ?", Date.today) 
    @equipment.each do |equipment| 
    equipment.users.each do |user| 
     mail(:to => user.email, :subject => "Equipment is out of calibration" 
    end 
end 
関連する問題