問題タブ [named-scope]
For questions regarding programming in ECMAScript (JavaScript/JS) and its various dialects/implementations (excluding ActionScript). Note JavaScript is NOT the same as Java! Please include all relevant tags on your question; e.g., [node.js], [jquery], [json], [reactjs], [angular], [ember.js], [vue.js], [typescript], [svelte], etc.
ruby-on-rails - act_as_tree (ancestry gem)、acts_as_list、およびデフォルトのモデル スコープの混合
祖先の宝石を使用して、ツリー内のいくつかのグループを構築しています。同時に、acts_as_list を使用して、ソートされたリスト内の同じツリー レベルにグループを保持しています。次のモデルがあるとします。
これはほぼ意図したとおりに機能しました。たとえば@group.path
、管理インターフェイスの上部にパンくずリスト ナビゲーションを生成するために使用しています。生成された SQL は問題ありません。ブレッドクラムはツリーの深さでソートされています。少なくとも、これは開発環境に当てはまります。
生成された SQL をトレースすると、祖先path
が結果の順序を生成しているのではなく、代わりに私default_scope
が引き継いでいることがわかりました。
そこで、上書きしてデフォルトのスコープを無視するようにモデルを修正しましたpath
。
しかし、これにより開発中の位置スコープが削除されdefault_scope
ましたが、本番環境ではまだ完全に無視されています。本番環境で SQL をトレースすると、祖先の深さの順序はわかりませんが、代わりに my からの位置の順序が表示されますdefault_scope
。
更新:メソッドに「パッチを当てる」という私の最初のアイデアpath
はややばかげていたので(ノックノック:継承されておらず、動的に定義されています)、次のことを試してみましたが、まだ役に立ちませんでした:
開発で呼び出すpath
と、生成される SQL は次のようになります。
それと比較して、本番環境で生成された SQL は次のとおりです。
開発では SQLite を使用し、本番では MySQL を使用しますが、それがここでの決定的な違いだとは思いません。
ruby-on-rails - Rails 3でActiveRecordアソシエーションをどのようにスコープしますか?
Rails3プロジェクトがあります。Rails 3には、Arelと、あるスコープを再利用して別のスコープを構築する機能が搭載されています。関係を定義するときにスコープを使用する方法があるかどうか疑問に思っています(たとえば、「has_many」)。
パーミッション列のあるレコードがあります。レコード(リレーションシップを介してアクセスされるレコードも含む)がフィルター処理されるように、アクセス許可列を考慮に入れるdefault_scopeを作成したいと思います。
現在、Rails 3では、default_scope(私が見つけたパッチを含む)は、proc(後期変数バインディングに必要)を渡すための実行可能な手段を提供していません。名前付きスコープを渡すことができるhas_manyを定義することは可能ですか?
名前付きスコープを再利用するというアイデアは、次のようになります。
または、関係でその名前付きスコープを暗黙的にコーディングすると、次のようになります。
実行時バインディングを使用してdefault_scopeを適用しようとしています。私はArelアプローチ(ある場合)を使用したいと思いますが、実行可能なオプションを使用します。
現在のユーザーを参照しているため、次のような最後の時点で評価されていない条件に依存することはできません。
sql - 名前付きスコープ(Rails)を使用したhas_many_throughアソシエーションの:uniq => true/Distinctオプションに関する問題
質問の下部にある更新を参照してください。
新しい機能を追加するためにアプリにいくつかの調整を加える必要がありましたが、変更により、以前は完全に機能していた:uniqオプションが壊れたようです。
設定は次の
#User.rb
とおりです。has_many:products、:through =>:seasons、:uniq => true
has_many:varieties、:through =>:seasons、:uniq => true
has_many:seasons
#product.rb
has_many:seasons
has_many:users、:through =>:seasons、:uniq => true
has_many:varieties
#season.rb
所属_to:製品
belongs_to:さまざまな
belongs_to:ユーザー
named_scope:by_product_name、:joins =>:product、:order =>'products.name'
#variety.rb
所属する:product
has_many:seasons
has_many:users、:through =>:seasons、:uniq => true
まず、比較するベースラインがあるように、現在壊れているビューの以前のバージョンを示したいと思います。以下のビューは、ユーザーに属する製品と品種をプルアップしています。以下の両方のバージョンで、同じ製品/品種をユーザーに割り当てたので、ログはまったく同じユースケースを調べます。
#user/show
これは機能します。各商品を1つだけ表示し、次に各商品の品種を表示します。以下のログでは、製品ID1に3つの関連する品種があります。また、製品ID43には何もありません。
上記のコードのログ出力は次のとおりです。
さて、上記のすべてがうまく機能していた以前のバージョンです。新しいバージョンでは、と呼ばれる結合テーブルにいくつかの列を追加し、seasons
それらの列をクエリする一連のカスタムメソッドを作成しました。その結果、seasons
モデル 上のこれらのメソッドにアクセスできるように、上記のビューコードに次の変更を加えました。
そのためのログ出力は次のとおりです。
私は2つの問題を抱えています:
(1):uniqオプションが。に対して機能していませんproducts
。同じ製品の3つの異なるバージョンがページに表示されています。
(2):uniqオプションが。に対して機能していませんvarieties
。これについてはまだ検証を設定していません。ユーザーが同じ種類を2回入力すると、ページに表示されます。以前の作業バージョンでは、これは当てはまりませんでした。
私が必要とする結果は、特定のIDに対して1つの製品のみが表示され、そのIDに関連付けられているすべての種類がそのような一意の製品とともに表示されることです。
私が目立つのは、最新のログ出力でのSQL呼び出しです。個別の呼び出しに「カウント」を追加しています。なぜそれをしているのか、それが問題の兆候であるのかどうかはわかりません。この未解決の灯台チケットは関連している可能性があるようですが、同じ問題かどうかはわかりません:https ://rails.lighthouseapp.com/projects/8994/tickets/2189-count-breaks-sqlite -has_many-through-association-collection-with-named-scope
アップデート
問題は、named_scopeがシーズンごとに1回呼び出されることだと思います。named_scopeには、返品される商品をシーズンIDで絞り込むものが必要です。
現在起こっていることは次のとおりです。
ユーザー=ユーザー
の季節を取得=ユーザーの季節を取得(たとえば、ユーザーには3つの季節があります)
製品=製品を
取得製品+=製品を取得
製品+=製品を取得
それぞれの商品をください
つまり、何が起こっているのかというと、uniqが壊れているのではなく、名前付きスコープにデリメータがないということです。(おもう)。
次のことを試しましたが、この例外がスローされます:ハッシュの奇数リスト
アイデア?
アップデート#2
さて、今私はそれがスコープされた名前ではないかもしれないと思っています。
では#user/show
、名前付きスコープをバイパスするようにループを変更しました。
上記は名前付きスコープを使用していませんが、それでも同じ結果が得られます。つまり、1つだけではなく、各製品のすべてのインスタンスがまだ表示されています。
最初のループを作成する上記のコードは、この質問の冒頭にリストした元のコードと同じです。違いは、このコードがループしてseasons
、にヒットするproducts
のに対し、元のコードはループしていることproducts
です。この違いは問題が隠れているところですが、私はそれを修正する方法がわかりません。
また、元の質問で、品種ループも機能させることができなかったと述べました。すぐ上のコードでコメントされた行を見ることができます。製品ではなく季節をループするときに、Railsがその品種のループにヒットすると、名前エラーがスローされます。
それは同じ問題の別の症状かもしれないようですか?
他のアイデアはありますか?
ruby-on-rails - named_scope を再利用して別の named_scope を定義する
私が見た問題の本質
ある日、間違いがなければ、named_scope を再利用して別の named_scope を定義する例を見たことがあります。このようなもの(正確な構文を思い出せませんが、それはまさに私の質問です):
問題は、可能な場合、正確な構文は何ですか? 私はそれを取り戻すことができず、Google も役に立ちませんでした。
いくつかの説明
私が実際にそれを望んでいるのは、Searchlogic を使用して複雑な検索を定義しているためです。これにより、次のような式が得られる可能性があります。
しかし、どこにでも置くには長すぎます。私の知る限り、Searchlogic はその場で named_scopes を定義するだけなので、次のように Card クラスに named_scope を設定したいと思います。
- これは、named_scope 内で長い Searchlogic メソッドを使用する場所です。しかし、繰り返しになりますが、構文はどうなるでしょうか? それを理解することはできません。
履歴書
では、named_scope の入れ子 (連鎖という意味ではありません) は実際に可能ですか?
mysql - named_scopeのPGError構文の問題
私は次のnamed_scopeを持っています。これはMySQLとsqliteで正常に動作しますが、Postgresでは爆弾です。
それから私はただ電話します:
エラーが発生します:
PGError:ERROR:「end」またはその近くの構文エラーLINE 1:... WHERE(start <'2010-03-17 14:03:24.995746' AND end> '201 ... ^:SELECT count(*)AS count_all FROM "courses" WHERE(start <'2010-03-17 14:03:24.995746' AND end> '2010-03-17 14:03:24.995748')
私のgoogle-fuは私を失敗させているので、StackOverflowが失敗しないことを望んでいます。そのスコープをPostgresに適したものにする方法について何かアイデアはありますか?ありがとう、
ドリュー
sql - この MySQL ステートメントを named_scope メソッドに変換するにはどうすればよいですか?
"select * from users, award where (users.id = award.user_id) and award.trophy_id not in (select award.trophy_id from award where award.trophy_id = #{trophy.id})"
ruby-on-rails - 方法: 検索ロジックとタグ
searchlogic をインストールし、will_paginate などを追加しました。
現在、acts_as_taggable_on プラグインを使用してタグ付けが有効になっている製品モデルがあります。searchlogic を使用してタグを検索したい。
タグ付け可能なプラグインのページは次のとおりです: http://github.com/mbleigh/acts-as-taggable-on
各製品には、Product.tag_list を使用してアクセスできる「tag_list」があります。
または、Product.tags[0] を使用して特定のタグにアクセスできます
検索に使用するスコープが見つかりませんが、検索ロジックでは使用できません。これが私の作業フォームの一部です。
:name_or_description_or_tagged_with_like と :name_or_description_or_tags_like および :name_or_description_or_tags_list_like を試して動作させようとしましたが、試したオプションが見つからないというエラーが表示されます (名前付きスコープが見つかりません)。これをどのように機能させるか、またはタグ付け可能なプラグインによって各製品に追加されたタグを検索できるようにする独自の named_scope を作成する方法を考えています。
ありがとう!
ruby-on-rails - 匿名スコープの一部としてnamed_scopeを使用する場合の警告
私は次の名前のスコープを持っています:
スクリプト/コンソールではこのように正常に動作します
しかし、匿名スコープの一部として、このように使用すると
2行目に警告が表示されます。
それでも機能しますが、警告の原因は何ですか?どうすればそれを取り除くことができますか?
sql - このRailsの名前付きスコープが空の(初期化されていない?)オブジェクトを返すのはなぜですか?
Rails アプリにMachine
は、次の名前付きスコープを含むモデル があります。
この名前付きスコープは、開発モードで正常に機能します。ただし、本番モードでは、期待どおりに 2 つのモデルが返されますが、モデルは空または初期化されていません。つまり、実際のオブジェクトは返されますが ( ではありませんnil
)、すべてのフィールドはnil
です。たとえば、コンソールで名前付きスコープの戻り値を調べると、次のように返されます。
しかし、ご覧のとおり、返されるオブジェクトのすべてのフィールドは に設定されていnil
ます。
本番環境と開発環境は基本的に同じです。どちらも SQLite データベースを使用しています。クエリ用に生成される SQL ステートメントは次のとおりです。
何がうまくいかないのですか?
ruby-on-rails - ruby on rails 名前付きスコープの実装
Rails を使用したアジャイル Web 開発の本から
ステートメント
データベースへのクエリは 1 つだけになります。
レールはこれをどのように実装しますか? 私はRubyが初めてで、これを可能にする特別な構造があるかどうか疑問に思っています。
そのようなメソッドを連鎖できるようにするには、named_scope によって生成された関数がそれ自体を返すか、さらにスコープを設定できるオブジェクトを返す必要があります。しかし、Ruby はこれが最後の関数呼び出しであり、今すぐデータベースにクエリを実行する必要があることをどうやって知るのでしょうか?
上記のステートメントは実際にデータベースにクエリを実行し、チェーンの結果として SQL ステートメントを返すだけではないため、これを尋ねます。