2017-12-21 9 views
0

からハッシュが含まれています生成ActiveRecordのは、私はこのようなスキーマきた文字列

userにhas_many post_valuesauthor belongs_toのhas_manyのaddresses

class User < ActiveRecord::Base 
    has_many :post_values 
end 

class PostValue < ActiveRecord::Base 
    belongs_to :user 
    belongs_to :author 
end 

class Author < ActiveRecord::Base 
    has_many :post_values 
    has_many :addresses 
end 

class Address < ActiveRecord::Base 
    belongs_to :author 
end 

このスキーマそれは一例だと、実際のケースを反映するものではありませんが。

今、私はpost_values_author_addressesのような文字列を持っています。

Railsライブラリ内のライブラリまたは宝石またはメソッドが存在し、その文字列から関連付けハッシュが返されます:{post_values: {author: :addresses}}

私は、このような方法を必要とする

...掻き回すはそのスコープと似た何かをすることを知っている:私は考えるでしょう

+2

これはハッシュが 'User:[:post_values、:author、:addresses]}'であるべきではないことを意味しています。 :post_valuesと 'PostValue' belongs_to:authorと' author' has_many:addressesです。あなたのスキーマは疑問です。読んだとき、それは 'User' has_many:post_valuesと' User' belongs_to:authorと 'User' has_many:addressesとして読み取られます。なぜ機能が必要なのか説明してもらえますか? – engineersmnky

+0

@engineersmnkyさんが質問を編集しました... – Pioz

+1

これには解析ロジックが必要です。あなたは( 'post_values_author_addresses'のように)あなたが得る文字列を制御できますか? 'post_values__author__addresses'に変更できますか?したがって、すべての二重アンダースコアはリレーション名の区切りとみなされます。また、@ engineersmnkyのコメントのように、post_values:{:user、author::addresses}のように、複数の関連付けを "同じレベルで"したい場合、この解析は難しいでしょう。これらの関連付けハッシュに一致する文字列をどのように記述しますか? – MrYoshiji

答えて

0

...

User.get_associations(:post_values_author_addresses) => {post_values: {author: :addresses}} 

私は明確だった願っていますPostValueクラスに 'has_one_through ...'関連付けを追加する。 Addresses

has_many :PostValues, :through => :author 

ため

has_many :addresses, :through => :author 

とリバースあなたの命名は、従来であれば、あなたは大丈夫かもしれませんがあなたは、一緒に物事を結びつけるために inverse_ofオプションが必要な場合があります。

このページには、その使用について説明します。http://guides.rubyonrails.org/association_basics.html#the-has-many-through-association

その後、あなたの文字列に一致する関連付けを見つけるためにPostValue.reflect_on_all_associationsを使用することができるかもしれません。 :throughの関連付けを試したことはありませんが、という名前の属性で必要なものを見つけることができます。何かのように:

PostValue.reflect_on_all_associations.select {|a| a.name == my_string} 

免責事項:私は独立してこれらの事を使用しますが、それらを一緒に試したことがありません。それがうまく動作しない場合は、私に知らせてください、私は試して、私の答えを適切に更新することができます。

関連する問題