0
class Subject
  has_many :subject_attribute_types
  has_many :subject_attributes

  accepts_nested_attributes_for :subject_attributes
end

class SubjectAttributeType
  belongs_to :subject
  has_many :subject_attributes

  attr_accessible :type_name
end

class SubjectAttribute
  belongs_to :subject
  belongs_to :subject_attribute_type

  attr_accessible :value
end

例えば:

s1 = Subject.create()
s2 = Subject.create()

sat1 = SubjectAttributeType.create(subject: s1, name: 'Age')
sat2 = SubjectAttributeType.create(subject: s1, name: 'Sex')

sat3 = SubjectAttributeType.create(subject: s2, type_name: 'Age')
sat5 = SubjectAttributeType.create(subject: s2, type_name: 'Username')

SubjectAttribute.create(subject: s1, subject_attribute_type: sat1, value: 20)
SubjectAttribute.create(subject: s1, subject_attribute_type: sat2, value: "male")
SubjectAttribute.create(subject: s2, subject_attribute_type: sat3, value: 21)
SubjectAttribute.create(subject: s2, subject_attribute_type: sat1, value: "user1")

問題:
正確な subject_attributes で検索を行うためのベスト プラクティスは何ですか。
年齢 >= 18 でニックネーム %user% のすべてのサブジェクトを検索したい場合

現在、私はransack gemを使用していますが、nested_attributesで検索する方法がわかりません

4

1 に答える 1

0

アプリのビジネス ロジックに問題があるようです。サブジェクトについて知るために AttributeType が必要なのはなぜですか?

class Subject < ActiveRecord::Base
  has_many :subject_attributes
  has_many :attribute_types, through: :subject_attributes
end

class SubjectAttribute < ActiveRecord::Base
  belongs_to :attribute_type
  belongs_to :subject
  attr_accessible :attribute_type_id, :subject_id, :value
end

class AttributeType < ActiveRecord::Base
  attr_accessible :type_name
end

その後、いくつかのデータを挿入すると:

s1 = Subject.create
s2 = Subject.create

sat1 = AttributeType.create(type_name: "Age")
sat2 = AttributeType.create(type_name: "Sex")
sat3 = AttributeType.create(type_name: "Username")

SubjectAttribute.create(subject:s1, attribute_type:sat1, value: 20)
SubjectAttribute.create(subject:s1, attribute_type:sat2, value:"male")
SubjectAttribute.create(subject:s2, attribute_type:sat1, value:21)
SubjectAttribute.create(subject:s2, attribute_type:sat3, value:"user1")

選択できるようになります。あなたの例では、いくつかの属性を使用しているため、いくつかのリクエストを行う必要があります。

そうすれば、値の名前を持つ件名を見つけることができます:

names = Subject.joins(:attribute_types).where("attribute_types.type_name = 'Username'   
                                               and value like '%user%'")
=> [#<Subject id: 2, created_at: "2013-05-29 11:11:51", updated_at: "2013-05-29 11:11:51">]

そうすれば、年齢の値を持つ件名を見つけることができます

ages = Subject.joins(:attribute_types).where("attribute_types.type_name = 'Age' 
                                              and value >= 18")
=> [#<Subject id: 1, created_at: "2013-05-29 11:11:42", updated_at: "2013-05-29 11:11:42">, 
   #<Subject id: 2, created_at: "2013-05-29 11:11:51", updated_at: "2013-05-29 11:11:51">]

そうすれば、交差する被写体を見つけることができます

subjects = (names&ages)
=> [#<Subject id: 2, created_at: "2013-05-29 11:11:51", updated_at: "2013-05-29 11:11:51">] 

動的な attribute_types を使用すると、select が非常に難しくなります。したがって、型と値のパラメーターごとに個別のリクエストを作成しても問題ない場合は、それを使用してください。それ以外の場合は、本当にサブジェクトの列だけでしょうか?

于 2013-05-29T12:25:14.093 に答える