0

Rails アプリでは、ユーザーのテーブルを作成しています。そのテーブルには、「メール、パスワード、画像」などの列があります。ユーザーを関連付けることができる国籍の具体的なリストを追加したいと考えています。

そこで、ユーザー モデルを作成しました: rails g model User email password image:string

国籍の配列が必要になったので、配列を作成する代わりに、国籍用に別のモデルを作成し、それをユーザーに関連付けたいと考えました。複数の国籍を持つことができると仮定すると、次のように設定します。

rails g model 国籍名:string

だから私は書いた user.rb : has_many :nationalities

そして、nationality.rb に次のように書きました: belongs_to :user

ユーザーがサインアップすると、アメリカ人、カナダ人、フランス人などから選択できるリストが表示されます...ユーザーが新しい国籍をリストに追加することはないため、これはアンチパターンである可能性があると直感的にわかります...選択のみですが、管理者はいつでも国籍を追加できます。

エラーは発生していませんが、うまく機能していません。正しく設定しましたか、それとも配列を使用して、ユーザーのテーブルの「国籍」という列の下に格納する必要がありますか?

4

3 に答える 3

0

編集:おっと、私は複数の国籍を持つという部分に対処しませんでした. あなたは使用を検討したいかもしれませんacts_as_taggable_on

https://github.com/mbleigh/acts-as-taggable-on

組み込みの便利な機能を使用して、タグ付けの多対多の動作を適切に処理します。

正しくお気づきのように、Nationalities の種類は変更されないため、今のところ、Nationalities にある種のグローバル配列 (名前空間内) を使用しても問題ないと思います。

しかし、物事はまっすぐな Array よりも少し複雑になると思いますAmerican, Canadian, French... などの選択肢を与えると言いますが、それで問題ありませんが、ビューのコンテキストでU.S., Canada, France代わりに使用する必要がある場合はどうなりますか? 次に、配列はハッシュになります...完全なRailsモデルが必要になるほど複雑になるとは思えません。単純なハッシュは、これらのユース ケースのほとんどをカバーする必要があります。

このような状況では、別のクラスまたはモジュールを作成すると役立つことがわかりました。たとえば、性別の場合、別のDBテーブルを作成する価値はまったくありません...それでも、ユーザーのgender列に保存するのが「M」、「F」、「O」だけであっても(他の場合、またはそうでない場合もあります)指定)、Genderそのドメイン ロジックを処理できるモジュールを作成します。

class Gender

   # better to make this private so that
   # only the factory constructor is exposed 
   def initialize(g)
     @g = g 
   end 

   def to_s  # and equivalent methods for serializing Gender into a M/F for database 
     return @g.to_s
   end 

   def pronoun 
     case @g
     when :M
       'he' 
     when :F
       'she'
     else
       'they'
   end 

end

def Gender(str) 
    case str
    when /^(?:m|male|man|boy)$/i
     Gender.new(:M)
    when /^(?:f|female|woman|girl)$/i
     Gender.new(:F)
    else 
     Gender.new(:O)
    end 
end
于 2013-10-13T00:40:01.317 に答える
0

Rails 4 を使用していますか? Postgresql は DB ですか? その場合、この組み合わせにより、ユーザー モデルに配列を格納できます。

基本的に、移行を次のように変更します。

class CreateUsers < ActiveRecord::Migration
  def change
    create_table :users do |t|
      t.string :name # or whatever attributes you've already defined

      t.string :nationalities, array: true, default: []
      t.timestamps
    end
  end
end

ActiveRecord モデルには次のものが含まれます。

class User < ActiveRecord::Base
  attr_accessible :nationalities
end

これにより、次のように国籍リストを作成できます。

user = User.create(name: 'Bob', nationalities: ['English', 'Australian', 'French'])

そして明らかにそれらを次のように抽出します:

user.nationalities
=> ['English', 'Australian', 'French']

それでも、ユーザーに関連付けまたは列を作成することについての決定は、フォームで国籍を持つユーザーを簡単に作成することを超えています。本当の問題は、「国籍はアプリでどのような役割を果たすのか」ということです。つまり、国籍には、それが独自のモデルであることを保証する追加データがありますか? それとも、すべてをユーザー テーブルに置くことができますか?

国籍がユーザー名と同じくらい多くの機能を持っている場合、それはユーザーにとどまることができません。ただし、国籍が「date_aquired」などの他の属性を持つことができる場合は、独自のモデルである必要があります。

于 2013-10-13T00:39:10.157 に答える
0

これは実際には Rails の質問というよりもデータベース設計に関する質問ですが、テーブルNationalityをドロップダウンのソースとして機能させるだけで、Userテーブルには単にnationality列があるだけです。余分な結合の必要性はわかりません。もちろん、nationality列の値は、テーブルによって入力されたドロップダウンからのユーザーの選択から取得されNationalityます。

それでも、ニーズは異なる場合があります。複数の国籍が必要な場合は、参加に固執してください。クヌースが言ったように、「時期尚早の最適化は諸悪の根源です」。

于 2013-10-13T00:20:42.953 に答える