2

レールとその関係がビルダーをどのように照会するか、具体的にはキャメルケースが関連する呼び出しのためにどのように変換されるかについて質問があります。

関連コード

class CustomerPlan < ActiveRecord::Base
  attr_accessible :customer_id, :plan_id, :startDate, :user_id

  has_many :planActions
end

class PlanAction < ActiveRecord::Base
  attr_accessible :actionType_id, :customerPlan_id, :notes, :timeSpent

  belongs_to :customerPlan
  belongs_to :actionType
end

ゲッターとセッターplan_action.actionType.nameは、関連するモデルから正しくプルするなど、問題なく機能します。ただしcustomer_plan.planActions.each、エラーが返されます。

SQLite3::SQLException: no such column: plan_actions.customer_plan_id: 
  SELECT "plan_actions".* 
    FROM "plan_actions"  
    WHERE "plan_actions"."customer_plan_id" = 1

列はデータベースで次のように定義されていますがcustomerPlan_id、これを使用するのは間違っていましたか?それは他のすべての呼び出しで機能し、他のすべての関係は正常に機能します。PlanAction->CustomerPlanですら。

私はすべてのドキュメントに目を通し、私が知っている他のすべてのソースについて検索しました。列を変更するのは簡単です。ここで何が起こっているのかを知りたいだけです。

お時間をいただきありがとうございます!


これに対する簡単な修正は、foreign_keyを明示的に設定することです。

has_many :planActions, :foreign_key => "customerPlan_id", :class_name => "PlanAction"

それでも、どこかでモデルの命名規則が欠落していると思います。何を理解できないようです。

4

2 に答える 2

1

DB列名のRails規則では、アンダースコアで区切られた単語を含む小文字を使用します(たとえば、、、author_idなどcomments_countupdated_at

Railsの規則に従うことを強くお勧めします。これはあなたの人生をはるかに楽にするでしょう。これをレールの規則に変更するには、移行を作成して列の名前を適切なスタイルに変更します。

ただし、列名にカスタムスタイルを使用する場合、railsはhas_many関係に、予想される外部列名を指定する:foreign_keyオプションを提供します。

class CustomerPlan < ActiveRecord::Base
  has_many :plan_actions, :foreign_key => 'customerPlan_id'
end

alias_attribute実際のDB列名とは異なるモデル属性名を使用する場合は、マクロを使用して列名のエイリアスを作成することもできます。しかし、私が述べたように、私は可能な限りレールの慣習に固執することをお勧めします。後で感謝します。

于 2012-10-13T00:49:03.190 に答える
0

Railsには3つの基本的な命名スキームがあります。

1つは定数用で、それはALL_UPPERCASE_SEPARATED_BY_UNDERSCORESです。

1つはクラス用で、それはAllCamelCaseWithNoUnderscoresです。

1つは変数とメソッド名用で、はall_lowercase_separated_by_underscoresです。

このようにする理由は、一貫性のためだけでなく、これらのメソッドを使用してそれらの間で自由に変換するためでもあります。

したがって、投稿されたコードをより多くのレールにするために-y:

class CustomerPlan < ActiveRecord::Base
  attr_accessible :customer_id, :plan_id, :start_date, :user_id

  has_many :plan_actions
end

class PlanAction < ActiveRecord::Base
  attr_accessible :action_type_id, :customer_plan_id, :notes, :time_spent

  belongs_to :customer_plan
  belongs_to :action_type
end
于 2012-10-13T03:20:15.743 に答える