い範囲ActiveRecord協会のレールを3?
-
18-09-2019 - |
質問
いレールを3プロジェクト.レールを用いた3Arelの再利用につ範囲を構築する。んかがある場合に利用スコープを定義する際関係などの"has_many").
ている記録の利用を許可していた。できる仕事をしたいと思っているdefault_scopeる私の許可列を考慮するよう記録もアクセスを通じて関係の差で管理します。
現在、レールを3,default_scopeを含むパッチがその場で発音を確認することがなを提供可能な手段を通論文集(必要な遅い変数。で定義するhas_manyる指定範囲に渡すことができ?
の考え方を再利用する範囲ようになる:
Orders.scope :my_orders, lambda{where(:user_id => User.current_user.id)}
has_many :orders, :scope => Orders.my_orders
または暗黙的に符号化の名の範囲の関係のようになる:
has_many :orders, :scope => lambda{where(:user_id => User.current_user.id)}
んだへのご連絡は下記より受け付けてdefault_scopeレイに結合する。私の希望は、Arelアプローチ(ある場合でも使用可能なオプションです。
私はを参考に現在のユーザできないのでなない条件を評価しているので、
has_many :orders, :conditions => ["user_id = ?", User.current_user.id]
解決
いることをお勧めしたく "名前のオシロスコープは死んだ"
著者の説明がどのように強Arelは:)
あなたにとってどんな年でしたね。
編#1月2014
としてコメントの状態で、その違いは現在も個人の味わいです。
しかし、まだまだ個人的にはお勧めを防Arelの範囲の上層がコントローラーもアクセスする直接モデル)、そうすることが必要:
- 作範囲なのでスルーする方法。この方法である、まさにコントローラ
- こんな温かい先生なモデルをコントローラー(そういうサービス層ところは少なくなったらしいします。の腐敗防止層 は サービスでのアクセスモデルの範囲を気にせずもつスコープを実施しています。
他のヒント
どのように関連の拡張子は?
class Item < ActiveRecord::Base
has_many :orders do
def for_user(user_id)
where(user_id: user_id)
end
end
end
Item.first.orders.for_user(current_user)
UPDATE:私はクラスメソッドまたはスコープとは対照的に、関連の拡張子に優位性を指摘したいと思いますが、関連プロキシの内部へのアクセス権を持っているということです。
proxy_association.ownerアソシエーションがその一部であるオブジェクトを返します。 proxy_association.reflectionは関連を記述する反射オブジェクトを返します。 proxy_association.targetはbelongs_toの又はhas_oneの、もしくはにhas_manyまたはhas_and_belongs_to_manyアソシエーションのために関連するオブジェクトのコレクションに関連付けられたオブジェクトを返す。
ここでは詳細: http://guides.rubyonrails.org/association_basics.html#関連-拡張する
その代わり、私はちょうど素晴らしい仕事をしているクラスのメソッドを定義してきたスコープの
def self.age0 do
where("blah")
end
私はのようなものを使用します:
class Invoice < ActiveRecord::Base
scope :aged_0, lambda{ where("created_at IS NULL OR created_at < ?", Date.today + 30.days).joins(:owner) }
end
あなたはを異なるモデルからスコープをマージするために、の方法をマージすることができます。 詳細は、この railscastする
だけることができるよう、ユーザーの注文だと思利用の関係?
仮に、現在のユーザアクセスすることができcurrent_user方法でコントローラ:
@my_orders = current_user.orders
これにより、みユーザーの特定の注文が表示されます。することができま恣意的に結合にnestedていくの資源を使用 joins
current_user.orders.joins(:level1 => { :level2 => :level3 }).where('level3s.id' => X)