ない助けることができるように機能していませんここに必要なものは - mapaddresses
にはcsv_values
が必要です。
class User
has_many :addresses
def csv_header
addresses.attribute_names
end
def csv_values
addresses.map do |addr|
addr.attributes.values
end
end
end
class Address
belongs_to :user
end
これで解決しますか?
私はコードでわかりやすくするために少しの周りのものをシフトし、delegate
を利用するように誘惑されるだろう:
class user
...
delegate :attribute_names, to: :addresses, prefix: true, allow_nil: true
...
end
class Address
...
def self.mapped_values
all.map { |addr| addr.attributes.values }
end
...
end
次に、あなただけのuser.addresses_attribute_names
とuser.addresses.mapped_values
を呼び出すことができます。
ヘッダー配列を得るためには、Address.column_names
を呼び出すこともできます。そうした場合には常に一貫性があります。
希望に役立ちます!
コメントに基づいて更新:どちらか一方
のクラスに(ヘッダを取得するためにUser.column_names
またはuser.attribute_names
を呼び出す:
ユーザーのために同じことを達成するには、次のように呼び出すことができます前者、後者の例)。
また、ユーザーのマップされた値が必要な場合は、アドレスモデルからself.mapped_values
メソッドをコピーして使用することができます。これは少し重複していますが、このような一対のメソッドでは、これらを別々のモジュールに分けていくつもりはありません。
最後のヒント - あなたは、ユーザーの集合(すなわち、User.all
)からaddress
メソッドを呼び出している場合は、非効率的な方法(User.includes(:addresses)...
)でデータベースを打つ避けるためにincludeにアドレスを、それを調整することを確認してください。
[テーブルの列名で配列を取得する方法](https://stackoverflow.com/questions/3479551/how-to-get-an-array-with-column-names-of- A-table) – jvillian