2016-04-03 11 views
0

ich zwei Modellklasse genannt order.rb und customer.rb haben:Wie ich Zugang zu einem anderen Modellklasse bekommen kann Attribute

order.rb

class Order < ActiveRecord::Base 
    belongs_to :customer 

validates :customer_id, :name, :age, :presence => true 

def self.to_csv 
     attributes = %w{ to_param name age } 
     CSV.generate(headers: true) do |csv| 
      csv << attributes 

       all.each do |t| 
       csv << attributes.map{ |attr| t.send(attr) } 
      end 
     end 
     end 

customer.rb

class Customer < ActiveRecord::Base 
belongs_to :order, primary_key: "customer_id" 
has_many :orders 

validates :phone_number, :name,:email,:presence => true, allow_blank: true 

Meine Frage ist, wie bekomme ich die customer.rb Daten wie es E-Mail und Name Attribute. Dann fügen Sie es zu den order.rb Daten hinzu. Wenn Sie das order.rb Modell betrachten, kann ich seine Attribute erhalten, die aufgelistet werden: Name und Alter, aber ich versuche, die customer.rb Attribute wie die E-Mail, den Namen und die Telefonnummer zu erhalten. Ich kann jedoch nur auf eine E-Mail zugreifen, wenn ich die unten abgebildete Methode anwende und die gleiche E-Mail immer wieder ausdrucke. Danke im Voraus, wenn mir jemand helfen kann.

def to_param 
    Customer.new.email 
    Customer.all.first.email 
end 
+0

Warum haben Sie in dem Modell "gehört_zu" Zuordnungen. Wie es aussieht, sollte es Kunden 'has_many' Bestellungen sein. Ist es nicht? – dp7

+0

@dkp Ich habe vergessen, es zu meinem Modell hinzuzufügen, aber ich ging zurück und ändere es. – user2803053

+0

Sie haben es zu "Order" modal hinzugefügt, Sie sollten es stattdessen zu 'Customer' Modell hinzufügen, wie dies' has_many: orders' – dp7

Antwort

0

Dadurch kehren E-Mail-IDs man nach einem anderen -

Customer.all.each do |customer| 
     customer.email 
    end 
+0

Wenn ich den obigen Code ausführe, gebe ich alle Attribute wie Name, E-Mails und Telefonnummer zurück. Außerdem werden die E-Mail-IDs nicht nacheinander zurückgegeben. Es gibt alle E-Mails in jedem Slot der Tabelle zurück. – user2803053

+0

Ich habe es zur Arbeit, danke für die Hilfe – user2803053

0
class Order < ActiveRecord::Base 
    belongs_to :customer 

    def self.to_csv 
    attributes = %w{ phone_number name age } 
    CSV.generate(headers: true) do |csv| 
     csv << attributes 
     all.each do |t| 
     # Note: Considering the attributes are defined in `Customer` model. 
     # It will get the `customer` of every order and send the message like 
     #  `email`, `name` and maps the responses to the messages 
     csv << attributes.map { |attr| t.customer.send(attr) } 
     end 
    end 
    end 
end 

class Customer < ActiveRecord::Base 
    has_many :orders 

    validates :phone_number, :name, :email, :presence => true, allow_blank: true 
    ... 
end 

Wenn alle Attribute in Order Modell möglicherweise nicht verfügbar, dann können Sie diejenigen übertragen, die an Customer fehlen wird Modell.

# in order.rb  
deligate :name, :email, :phone_number, to: :customer, allow_nil: true 

# Then this will work; no need of `.customer` as message will be delegated 
csv << attributes.map { |attr| t.send(attr) } 

:allow_nil - wenn auf true gesetzt, verhindert ein NoMethodError angehoben werden. See this for more info about delegation.

Kommentieren Sie hier, wenn Sie weitere Hilfe benötigen.

+0

Ich folge den Schritten, aber ich laufe über das gleiche Problem. Es gibt alle Attribute zurück und es gibt nicht jede E-Mail zurück – user2803053

+0

welche hast du versucht? der ehemalige oder später? Es hätte funktionieren müssen. Bitte sehen Sie sorgfältig und stellen Sie sicher, dass nichts fehlt. Ich bin hier um zu helfen – illusionist

+0

Ich habe es zu arbeiten, danke für die Hilfe. Der Link zur Delegationshilfe führt mich zur richtigen Antwort. – user2803053