在我的CakePHP 1.2.5应用程序中,我有一个属于Profile模型的User模型.User模型有一个username字段,当find()在Profile模型上执行a 时,我想总是自动检索值User.username.我认为修改我的Profile模型的beforeFind()方法以自动包含所需的字段是有意义的.
这是我试图做的事情:
public function beforeFind($queryData) {
// determine if the username data was already requested to be included in the return data via 'User.username' or 'User' => array('username').
$hasUserData = isset($queryData['contain']) && in_array("User.{$this->User->displayField}", $queryData['contain']);
$hasUserData |= isset($queryData['contain']['User']) && in_array($this->User->displayField, $queryData['contain']['User']);
// request the the username data be included if it hasn't already been requested by the calling method
if (!$hasUserData) {
$queryData['contain']['User'][] = $this->User->displayField;
}
return …Run Code Online (Sandbox Code Playgroud) 我已经看到了一些在Rails中:include调用ActiveRecord find方法之一时传递哈希值的例子.但是,我还没有看到任何关于这是否可以通过关系方法的例子.例如,假设我有以下内容:
def User < ActiveRecord::Base
has_many :user_favorites
has_many :favorites, :through => :user_favorites
end
def Favorite < ActiveRecord::Base
has_many :user_favorites
has_many :users, :through => :user_favorites
end
def UserFavorite < ActiveRecord::Base
belongs_to :user
belongs_to :favorite
end
Run Code Online (Sandbox Code Playgroud)
我看到的所有示例都显示如下代码:
User.find(:all, :include => :favorite)
Run Code Online (Sandbox Code Playgroud)
但我没有看到任何关于使用关系的例子.相反,我可以做这样的事情吗?
User.favorites(:include => :user)
Run Code Online (Sandbox Code Playgroud) entity-relationship ruby-on-rails query-optimization select-n-plus-1
我正试图在我的Rails 3应用程序中加载.我把它缩小到一个非常基本的样本,而不是生成我期望的一个查询,它产生4.
首先,这是我的模型的简单细分.
class Profile < ActiveRecord::Base
belongs_to :gender
def to_param
self.name
end
end
class Gender < ActiveRecord::Base
has_many :profiles, :dependent => :nullify
end
Run Code Online (Sandbox Code Playgroud)
然后我有一个ProfilesController :: show动作,我在那里查询模型.
def ProfilesController < ApplicationController
before_filter :find_profile, :only => [:show]
def show
end
private
def find_profile
@profile = Profile.find_by_username(params[:id], :include => :gender)
raise ActiveRecord::RecordNotFound, "Page not found" unless @profile
end
end
Run Code Online (Sandbox Code Playgroud)
当我查看生成的查询时,它显示以下内容:
SELECT `profiles`.* FROM `profiles` WHERE `profiles`.`username` = 'matt' LIMIT 1
SELECT `genders`.* FROM `genders` WHERE (`genders`.`id` = 1)
Run Code Online (Sandbox Code Playgroud)
我期望看到的是一个查询:
SELECT `profiles`.*, `genders`.* …Run Code Online (Sandbox Code Playgroud) ruby-on-rails query-optimization eager-loading ruby-on-rails-3
我猜它使用的单位是米(m),但从我发现的文档中看起来并不清楚.它是否正确?
如果是这样,只是为了验证,为了在英里/米之间进行转换,我假设这些功能应该起作用:
public static function mi2m($mi) { // miles to meters
return $mi * 1609.344;
}
public static function m2mi($m) { // meters to miles
return $m * 0.000621371192;
}
Run Code Online (Sandbox Code Playgroud) 我有一组与我的控制器有关的特定视图,我想要任何调用*_path或*_url附加一组参数.
是否有一些我可以覆盖的魔术方法让我这样做?我不知道在Rails代码中甚至处理的方法*_path或*_url方法.
编辑为清晰起见:我正在寻找一种方法来做到这一点,这样我就不必修改每个需要发生的视图中的每个链接.我不希望每个触及这组视图的编码器都必须记住在他们添加到页面的每个链接上附加一个参数.应自动附加相同的参数.我认为改变*_url或*_path称为失败.类似地,必须覆盖每个*_url或*_path调用被认为是失败的,因为每当添加/删除新链接时都必须添加/删除新方法.
我想存储一组基于它们所代表的值键入的对象.这些键可以重复.例如:
[4] => Bob
[5] => Mary
[5] => Sue
[9] => Steve
[10] => Jason
[10] => Michelle
Run Code Online (Sandbox Code Playgroud)
本质上,我想循环遍历这个并查看每个键并说"是否有另一个对象(在这种情况下是人),其键在当前键的1之内?如果是,请匹配它们并从集合中删除它们. " 我将在上面的示例中迭代"1"值,直到集合为空(或者为奇数场景保留一个对象).
我不相信我试图这样做的方式是最好的方式,所以我也愿意接受反馈.
在 Rails 2 生成器中,可以通过以下方式将数据传递给模板:
record.template(
"src.html.erb",
"dest.html.erb",
:assigns => { :id => id, :name => name }
Run Code Online (Sandbox Code Playgroud)
在 Rails 3 中,看起来模板是新方法。不幸的是,它看起来像第三个参数,config,只接受一个:verbose选项。试图通过传递值:assigns似乎不起作用。
有谁知道如何将动态值传递给我的 Rails 3 模板?
我有一个我正在拆分的字符串,如下所示:
foo, bar, baz, etc = str.split(',')
Run Code Online (Sandbox Code Playgroud)
例如,如果str等于"一,二,四",则baz最终等于""(空字符串).有没有简单的方法来循环这些参数,nil如果它们是一个空字符串,将它们转换为?还是我坚持做以下事情?
foo = nil if foo.blank?
bar = nil if bar.blank?
baz = nil if baz.blank?
etc = nil if etc.blank?
Run Code Online (Sandbox Code Playgroud) 我有两个关于这个问题的表:conversations有很多messages.基本结构(只有相关列)如下:
conversations (
int id (PK)
)
create table conversation_participants (
int id (PK),
int conversation_id (FK conversations),
int user_id (FK users),
unique key on [conversation_id, profile_id]
)
create table messages (
int id (PK),
int conversation_id (FK conversations),
int sender_id (FK users),
int recipient_id (FK users),
text body
)
Run Code Online (Sandbox Code Playgroud)
对于每个对话条目,给定user_id我希望收到:
conversations.*)order by messages.id desc limit 1)messages.id desc)不幸的是,我似乎可以找到所有类似于MySQL的查询帮助,这在PostgreSQL中不起作用.我发现最接近的是StackOverflow上的这个答案给出了一个select distinct …
Faye允许您监控各种事件,例如handshake或subscribe.这些回调块仅提供client_id值而不是客户端本身.例如:
server = Faye::RackAdapter.new(mount: '/faye', timeout: 45)
server.bind(:handshake) do |client_id|
puts "Received handshake from #{client_id}"
end
Run Code Online (Sandbox Code Playgroud)
如何才能访问客户端client_id?或者如何在握手中访问更多信息,例如请求标头中提供的cookie(如果该信息甚至可用)?
我试图在我的Symfony 1.4项目中使用sfDoctrineGuardPlugin.此插件包含一个schema.yml文件,该文件用于定义所涉及的所有表.表名采用以下形式:sf_guard_user,sf_guard_user_group,sf_guard_user_permission等.我宁愿将这些表命名为:users,user_groups,user_permissions等.有没有办法让我这样做而无需直接编辑插件代码?
在Rails中,您可以创建一个跨越多行的锚标记,执行如下操作:
<% link_to target_url_path do %>
<span class="title">Example</span>
<span class="excerpt">Neque porro quisquam est qui dolorem ipsum...</span>
<%= image_tag 'example.png', :class => 'thumbnail' %>
<% end >
Run Code Online (Sandbox Code Playgroud)
我想知道如何使用类似的方法设置值.本质上,像:
<% my_variable = do %>
<span class="title">Example</span>
<span class="excerpt">Neque porro quisquam est qui dolorem ipsum...</span>
<%= image_tag 'example.png', :class => 'thumbnail' %>
<% end >
Run Code Online (Sandbox Code Playgroud)
编辑:万一有人好奇为什么我问,这是因为facebox_link_to似乎不允许你使用do像link_to这样的语法.